对对象使用C#动态方法

时间:2011-07-14 15:28:25

标签: c# .net reflection dynamic-language-runtime

我有一个方法应该从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);
}

作品。

2 个答案:

答案 0 :(得分:1)

我认为您可能需要将“GetDataSource()”的返回类型定义为“List<dynamic>”。

当然,正如评论中所述,对象必须定义属性“id”。

答案 1 :(得分:1)

C#区分大小写,包括使用dynamic关键字时。你的调用是int id = current.Id;,但你谈到属性是小写的id,你的反射调用看起来不区分大小写。动态关键字甚至可以跨程序集边界调用公共实例属性也没有问题,因为它说找不到方法我最好的猜测是你需要使用int id = current.id;