2012-04-18 7 views
2

に私は、これは私のタイプであると仮定し、一部の種類(1種類毎時間)のプロパティの選択を渡す必要があります。パスプロパティのC#

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助けることができる、私はちょうどオブジェクトのリストを渡すことができると思うが、私は属性と名前を使用することはできませんが、これを処理するためのあなたの提案は何ですか?またはこれのような何か?私が間違っている場合はどうすれば実装できますか?

+0

私はここでそれを見つけた: http://stackoverflow.com/questions/10222783/get-property-name-and-type-by-pass-it-directly – Saeid

答えて

-1

typeof(Product).GetProperties()は、すべての(公開)プロパティをPropertyInfo[]とします。

MSDNも参照してください。

+0

を私は考えていませんこれは私の質問に関連しています! – Saeid

1

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

2つのタイプのプロパティを1つに連結しようとしているようですね。基本的に、あなたがプロパティのキー付きリストが欲しいから開始すること

C# deep/nested/recursive merge of dynamic/expando objects

:これを見る、ネストされたマージの実現のために

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

:あなたはExpandoObjectを必要としています。次のコードは、任意の.NETオブジェクトのためにそれを行うだろう。

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

そして、それは正確にそれが何であるかに依存して、その後、あなたが達成したい - オブジェクトの真のコピーを、他と合併、または単にリストを維持します。

0

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

targetType.Properties = product.GetType().GetProperties().ToList(); 
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; 
    } 
} 
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>(); 
}