使用c#动态方法获取对象



我有一个应该从列表返回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;

相关内容

  • 没有找到相关文章

最新更新