我想为我的视图模型类的每个属性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
}
}
答案 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
,因为您可能需要这些实例属性...