2016-05-05 85 views
1

編輯 對不起,我的問題不清楚。我想添加到列表中不僅屬性名稱,但它的值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

是的,我只想要列表中的某種屬性 –

+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>(); 

注意,這只是給你的想法,你需要的,如果需要處理性能沒有getter方法來評估。

最後但並非最不重要的,如果你需要的值屬性名,那麼你可以建立一個元組的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();