我有一个应该从列表返回id的方法。通常我会使用反射来完成这项任务(我不能使用泛型方法,因为类通常是POCOS,不共享接口或基类,我不能修改它们)。然而,我想到了新的dynamic
关键字,并想尝试一下。
然而我的问题是dataSource[index]返回一个对象。在运行时,它确保对象本身是我自己的类之一,并具有id属性。但我想,因为方法返回一个对象,我得到一个RumtineBinderException在运行时访问current.id
public List<int> GetItemIds()
{
var result = new List<int>();
var dataSource = GetDataSource(); // returns an List<Object>
for (int i = 0; i <= dataSource.Count - 1; i++)
{
dynamic current = dataSource[i];
int id = current.Id; // throws RuntimeBinderException: Object has no definition for id
}
return result;
}
是否有一种方法来实现我想要的,或者我必须回到反射来获得id属性?
更新:current.GetType() returns object
current.GetType().GetProperties() returns a TargetInvocationException
我的Pocos生活在我的主要项目(VB.net),但这个方法是在一个类库,也许这就是原因。然而:
object current = dataSource[i];
PropertyInfo prop = current.GetType().GetProperty("id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (prop != null)
{
int id = (int)prop.GetValue(current, null);
}
。
我认为您可能需要将" GetDataSource()
"的返回类型定义为" List<dynamic>
"。
当然,如注释中所述,对象必须定义属性"id"
c#是区分大小写的,包括当你使用动态关键字时。你的调用是int id = current.Id;
,但你谈论的属性是小写的id,你的反射调用看起来不区分大小写。动态关键字调用公共实例属性应该没有问题,即使跨越程序集边界,因为它说方法没有找到我最好的猜测是,你需要使用int id = current.id;