2

いくつかのタイプ(毎回1つのタイプ)のプロパティの選択を渡す必要があります。これが私のタイプであると想定します。

public class Product {

    [PrimaryKey]
    public long Id { get; set; }
    [DisplayName("Name")]
    public string Title { get; set; }
    [Foreignkey(Schema = "Products", Table = "MajorCategory", Column = "Id")]
    [DisplayName("MCat")]
    public string MajorCategory { get; set; }
    [Foreignkey(Schema = "Products", Table = "Category", Column = "Id")]
    [DisplayName("Cat")]
    public string Category { get; set; }
    public long CategoryId { get; set; }
    [BoolAsRadio()]
    public bool IsScanAllowed { get; set; }
}

したがって、このタイプのプロパティのリストを他のタイプ(ターゲットタイプ)に渡し、プロパティ名と属性を使用する方法が必要です。次の擬似コードのような値は必要ありません。

List<Property> propertyList = new List<Property>();
propertyList.Add(Product.Id);
PropertyList.Add(Product.Title);
TargetType target = new TargetType();
target.Properties = propertyList;


public class TargetType  {

   public List<Property> Properties { get; set;}

   GetAttributes() {

      foreach(Property item in Properties){

         Console.WriteLine(item.Name)

         //Get Attributes
      }
   }


}

そのようなProduct.Id名前と属性をそのまま渡して使用する方法はありますか?よくわかりませんPropertyInfoが、役立つかもしれません。オブジェクトのリストを渡すことができると思いますが、その場合、属性と名前を使用できません。これを処理するための提案は何ですか。またはこのようなもの?私がまったく間違っている場合、どうすればそれを実装できますか?

4

5 に答える 5

1

ここで.NETのリフレクションを利用できます。

List<PropertyInfo> propertyList = new List<PropertyInfo>();
Type productType = typeof (Product);

propertyList.Add(productType.GetProperty("Id"));
propertyList.Add(productType.GetProperty("Title"));
TargetType target = new TargetType();
target.Properties = propertyList;

public class TargetType  {

   public List<PropertyInfo> Properties { get; set;}

   List<object> GetAttributes()
   {
       List<object> attributes = new List<object>();

       foreach(PropertyInfo item in Properties)
       {
           Console.WriteLine(item.Name);
           attributes.AddRange(item.GetCustomAttributes(true));
       }

       return attributes;
   }
}
于 2012-04-18T07:58:41.797 に答える
1

おかしい、私はちょうど同様の質問に答えていた、または少なくともそうだと思う.

2 つのタイプのプロパティを 1 つに連結しようとしているように見えますか? ExpandoObject が必要です。

http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject%28v=vs.100%29.aspx

ネストされたマージの実装については、次を参照してください。

動的/拡張オブジェクトの C# の深い/ネストされた/再帰的なマージ

基本的に、プロパティのキー付きリストから開始する必要があります。次のコードは、任意の .NET オブジェクトに対してこれを行います。

var props = object.GetType().GetProperties().ToDictionary<PropertyInfo, string>(prop => prop.Name);

その後は、正確に何を達成したいかによって異なります-オブジェクトの真のコピー、別のオブジェクトとのマージ、または単にリストを維持します。

于 2012-04-18T07:50:53.247 に答える
0

式ツリーを使用してプロパティのリストを作成できます。たとえば、次のように作成できます。


var propertiesListBuilder = new PropertiesListBuilder<Product>();
propertiesListBuilder
    .AddProperty(_ => _.Id)
    .AddProperty(_ => _.Title);

var target = new TargetType();
target.Properties = propertiesListBuilder.Properties;

ここでの唯一の懸念はパフォーマンスです。つまり、このようなプロパティリストを何度も再作成することはお勧めできません。おそらく、キャッシュする必要があります。同時に、プロパティリストのインテリセンス、コンパイラチェック、リファクタリングのサポートを利用できます。

以下は、このようなもののサンプル実装です。


static class PropertyInfoProvider<T>
{
    public static PropertyInfo GetPropertyInfo<TProperty>(Expression<Func<T, TProperty>> expression)
    {
        var memberExpression = (MemberExpression)expression.Body;

        return (PropertyInfo)memberExpression.Member;
    }
}

class PropertiesListBuilder<T>
{
    public IEnumerable<PropertyInfo> Properties
    {
        get
        {
            return this.properties;
        }
    }

    public PropertiesListBuilder<T> AddProperty<TProperty>(
        Expression<Func<T, TProperty>> expression)
    {
        var info = PropertyInfoProvider<T>.GetPropertyInfo(expression);
        this.properties.Add(info);

        return this;
    }

    private List<PropertyInfo> properties = new List<PropertyInfo>();
}

于 2012-04-18T07:58:55.973 に答える
0

のタイプとして、PropertyInfoのリストを使用できます。プロパティを取得するには、 を使用してこのように試すことができます。List<PropertyInfo>TargetType .PropertiesReflection

targetType.Properties = product.GetType().GetProperties().ToList();
于 2012-04-18T07:53:58.660 に答える
-1

typeof(Product).GetProperties()すべての(パブリック)プロパティを として提供しPropertyInfo[]ます。

MSDNも参照してください。

于 2012-04-18T07:50:14.593 に答える