我有一个方法应该从List返回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
My 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);
}
作品。
答案 0 :(得分:1)
我认为您可能需要将“GetDataSource()
”的返回类型定义为“List<dynamic>
”。
当然,正如评论中所述,对象必须定义属性“id”。
答案 1 :(得分:1)
C#区分大小写,包括使用dynamic关键字时。你的调用是int id = current.Id;
,但你谈到属性是小写的id,你的反射调用看起来不区分大小写。动态关键字甚至可以跨程序集边界调用公共实例属性也没有问题,因为它说找不到方法我最好的猜测是你需要使用int id = current.id;