C#遍历类属性并添加到列表中的某些类型

时间:2016-05-05 07:46:22

标签: c# reflection

修改 对不起,我的问题不明确。我想在列表中不仅添加属性名称,还要添加其值

我想迭代一个类的所有属性并找到某个类型的所有属性并将它们添加到列表中。我用来迭代的代码是:

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
    }
}

有什么想法吗?

由于

1 个答案:

答案 0 :(得分: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();