反射调用未知属性类型的方法

时间:2015-12-11 17:37:59

标签: c# nested-class system.reflection

我想为我的视图模型类的每个属性IEnumerable<class>调用泛型方法'get_',以避免创建显式获取每个列表的冗长的switch语句...有谁知道如何获取一般的对象类型和方法?

    foreach (var prop in vm.GetType().GetProperties().Where(x => x.GetCustomAttributes<ExportAttribute>().Any()))
    {
        var objType = ??;
        var method = objType.GetMethod(<by name>);
        var list = method.Invoke(prop, null);
        foreach (var item in list)
        {
            //do something
        }
    }

1 个答案:

答案 0 :(得分:4)

我会使用类似的东西:

foreach (var prop in vm.GetType()
                       .GetProperties()
                       .Where(x => x.GetCustomAttributes<ExportAttribute>().Any()))
{
    var list = (IEnumerable) prop.GetValue(vm, null);
    foreach (var item in list)
    {
        // do something
    }
}

现在item将被输入为object ...但无论如何你无法做得更好。你的“做某事”代码无论如何都不能使用元素类型的任何成员,因为它可以是任何类型。

另一方面,如果您知道每个属性都将实现IEnumerable<T>,其中T在每种情况下都有一个共同的基类型,那么由于{{1}的通用协方差在.NET 4中引入,你可以写:

IEnumerable<T>

然后您可以访问foreach (var prop in vm.GetType() .GetProperties() .Where(x => x.GetCustomAttributes<ExportAttribute>().Any())) { var list = (IEnumerable<BaseType>) prop.GetValue(vm, null); foreach (var item in list) { // do something } }

请注意,我已将调用目标更改为item.PropertyDeclaredInBaseType而非vm,因为您可能需要这些实例属性...