1

私はここここで同様の質問をしました

これはサンプルタイプです:

    public class Product {

    public string Name { get; set; }
    public string Title { get; set; }
    public string Category { get; set; }
    public bool IsAllowed { get; set; }

}

そして、いくつかのHTMLコードを生成するためのプロパティを必要とするGenericクラスがあります。

public class Generator<T> {

    public T MainType { get; set; }
    public List<string> SelectedProperties { get; set; }

    public string Generate() {

        Dictionary<string, PropertyInfo> props;
        props = typeof(T)
                .GetProperties()
                .ToDictionary<PropertyInfo, string>(prop => prop.Name);

        Type propType = null;
        string propName = "";
        foreach(string item in SelectedProperties) {
            if(props.Keys.Contains(item)) {
                propType = props[item].PropertyType;
                propName = item;

                // Generate Html by propName & propType
            }
        }

そして、私はこのタイプを次のように使用します。

Product pr = new Product();
Generator<Product> GT = new Generator<Product>();
GT.MainType = pr;
GT.SelectedProperties = new List<string> { "Title", "IsAllowed" };

GT.Generate();

したがって、このプロセスはそのままの方が簡単なはずですが、どのように実装するかはわかりません。次の擬似コードのように、プロパティをジェネレータに渡す方が簡単だと思います。

GT.SelectedProperties.Add(pr.Title);
GT.SelectedProperties.Add(pr.IsAllowed);

これが可能かどうかはわかりませんが、必要なのは2つだけです。1-PropertyNameのようなもの:IsAllowed2-プロパティタイプのようなもの:bool。たぶん、渡す必要はないMainTypeので、プロパティタイプを取得するために使用するので、上記のように処理できる場合は、もう必要ありません。

このようなものを実装するためのあなたの提案は何ですか?

これを行うためのより良い方法はありますか?

アップデート

ArsenMkrt使用できることがわかったが、プロパティタイプを取得できないと述べたようMemberExpressionに、デバッグでプロパティタイプが表示されます。図を参照してください。

ここに画像の説明を入力してください

では、どうすればプロパティタイプを取得できますか?

ここで見つけました。

4

1 に答える 1

4

コードが次のようになるよりも、式ツリーを使用できます

GT.SelectedProperties.Add(p=>p.Title);
GT.SelectedProperties.Add(p=>p.IsAllowed);

List for SelectedPropertiesから派生したカスタムコレクションクラスを作成し、次のようなaddメソッドを作成する必要があります

   //where T is the type of your class
   public string Add<TProp>(Expression<Func<T, TProp>> expression)
   {
        var body = expression.Body as MemberExpression;
        if (body == null) 
            throw new ArgumentException("'expression' should be a member expression");
        //Call List Add method with property name
        Add(body.Member.Name);
   }

お役に立てれば

于 2012-04-19T06:39:38.363 に答える