繁体   English   中英

使用C#反射访问IList中的项目

[英]Accessing items in an IList with C# reflection

我有一个带有Items属性的类,它是一个IList:

class Stuff {
    IList<OtherStuff> Items;
}

我希望能够在一个方法中接收一个字符串(我最初认为是这种格式:Items [0]),并且能够检索Items列表中的第一项。

我尝试了这个:

object MyMethod(string s, object obj) {
    return obj.GetType().GetProperty(s).GetValue(obj,null);
}

s为'Items [0]',但不起作用...还尝试解析参数以仅访问对象的属性'Items',然后访问索引(知道它是IList)。

这些方法都不起作用...有什么想法吗?

有什么想法吗?

您可以访问该属性,然后可以将其转换为列表。

T GetListItem<T>(object obj, string property, int index)
{
    return (obj.GetType().GetProperty(property).GetValue(obj, null) as IList<T>)[index];
}

示例代码的工作示例:

OtherStuff item = GetListItem<OtherStuff>(obj, "Items", 0);

如果要测试对象以查看其是否具有数字索引器,而不考虑它是否为IList,然后通过反射调用索引器,则可以尝试使用此方法。

如果对象具有索引器,则返回true,并且还用第0个索引的值填充value

public static bool TryGetFirstIndexWithReflection(object o, out object value)
{
    value = null;

    // find an indexer taking only an integer...
    var property = o.GetType().GetProperty("Item", new Type[] { typeof(int) });

    // if the property exists, retrieve the value...
    if (property != null)
    {
        value = property.GetValue(list, new object[] { 0 });
        return true;
    }

    return false;
}

请注意,此示例未尝试妥善处理异常,例如IndexOutOfRangeException 如果您认为相关,则取决于您自己添加。

物品不是财产,所以我的方法行不通。 应该是这样,所以我将其转换为一个属性,现在它运行正常。

您应该尝试这样:

object GetFirstItemByReflection(object obj) {
    return obj.GetType().GetMethod("get_Item").Invoke(obj, new object[] { 0 } );
}

进行适当的检查。

“ get_Item”是在按集合中的索引访问项目时使用的“生成”方法。

当获取其MethodInfo时,将在您的集合上调用它,并向其传递“ 0”参数以获取第一项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM