2016-05-05 2 views
1

EDIT 申し訳ありませんが、私の質問は明確ではありませんでした。プロパティ名だけでなくその値をリストに追加したいC#クラスのプロパティを繰り返し処理し、特定の種類のリストに追加する

クラスのすべてのプロパティを繰り返し処理し、特定のタイプのすべてのプロパティを見つけてリストに追加したいとします。私が反復するために使用するコードは次のとおりです。

List<CustomAttribute> attributes = new List<CustomAttribute>(); 
PropertyInfo[] properties = typeof(CustomClass).GetProperties(); 

foreach (PropertyInfo property in properties) 
{ 
    if (property.PropertyType == typeof(CustomAttribute)) 
    { 
     //here I want to add property to list 
    } 
} 

おかげ

+0

あなたが特定のプロパティを追加したいですタイプ? –

+0

yes私は自分のリストにある特定のタイプのプロパティのみを必要とします –

+0

'CustomAttribute'はCustomAttributeですか、それとも普通のタイプですか? – thehennyy

答えて

1
public static List<PropertyInfo> PropertiesOfType<T>(this Type type) => 
    type.GetProperties().Where(p => p.PropertyType == typeof(T)).ToList(); 

そして、次のようにあなたがそれを使用したい:

var properties = typeof(CustomClass).PropertiesOfType<CustomAttribute>(); 

あなたが値です必要なものを、その後、特定のインスタンスでタイプTの性質のあなたができれば次の操作を行います。

public static List<T> PropertyValuesOfType<T>(this object o) => 
     o.GetType().GetProperties().Where(p => p.PropertyType == typeof(T)).Select(p => (T)p.GetValue(o)).ToList(); 

そして、あなたはとしてそれを使用したい:これはちょうどあなたのアイデアを与えること

CustomClass myInstance = ... 
var porpertyValues = myInstance.GetPropertyValuesOfType<CustomAttribute>(); 

注意、あなたはありませんゲッターとプロパティを扱うが必要とされているかどうかを評価する必要があります。

そして最後にではなく、少なくとも、あなたが値プロパティ名を必要とする場合は、あなたが情報を格納するタプルのListを構築することができます

public static List<Tuple<string, T>> PropertiesOfType<T>(this object o) => 
     o.GetType().GetProperties().Where(p => p.PropertyType == typeof(T)).Select(p => new Tuple<string, T>(p.Name, (T)p.GetValue(o))).ToList(); 
関連する問題