我有一个带有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)
这些方法都没有奏效......有什么想法吗?
有什么想法吗?
答案 0 :(得分:1)
您可以访问该属性,然后将其转换为列表。
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);
答案 1 :(得分: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
。如果您发现相关内容,则由您自行添加。
答案 2 :(得分:0)
项目不是财产,所以我的方法不起作用。它应该是,所以我把它变成了一个属性,现在它正在顺利运作。
答案 3 :(得分:-1)
你应该试试这个:
object GetFirstItemByReflection(object obj) {
return obj.GetType().GetMethod("get_Item").Invoke(obj, new object[] { 0 } );
}
进行适当的检查。
“get_Item”是您在集合中按索引访问项目时使用的“生成”方法。
当你获得它的MethodInfo时,你在你的集合上调用它,并传递“0”参数,以获得第一个项目。