我有一堆类都包含Shared
ReadOnly
字典。如果我想在类是泛型类型时访问该Dictionary(例如当我有一个包装器函数将T作为所有这些类实现的接口时),那么它的方法是什么?
基础研究表明我想做GetType(T).GetMember("Dict")
之类的事情,但是会返回MemberInfo
类型,并且不能转换为我定义类型的字典。要以这种方式调用函数,可以使用委托+ CreateDelegate
+ GetMethod
。但GetMember的东西似乎没有等价的Create*
。或者我错过了什么?
如果我将GetMember
调用插入到即时窗口中,然后使用下标就好像它是一个数组一样,那么调试输出就说我得到了一个字典。但是如果我在我想写的实际函数中使用相同的方法,那么我得到一个关于System.Reflection.MemberInfo
的错误无法转换为Dictionary(X,Y)
答案 0 :(得分:2)
你快到了。
GetMember
返回您传递的所有成员的数组(您可以传递包含通配符*
的字符串并返回多个成员)。因此,在这种情况下,您必须索引返回值以获得所需的实际MemberInfo
。
然后,为了对其执行任何操作,您需要将其转换为实际的-Info
类型,在本例中为FieldInfo
。
获得FieldInfo
后,您可以在其上调用GetValue
以获取该字段的实际值。您需要将Nothing
传递给GetValue
,因为该字段是共享的,因此您希望获取此字段值的“实例”根本不是实例。
最后,您需要将GetValue
的返回值强制转换为实际字典类型,因为它的类型为Object
。
然后你可以查看你的字典。
这可能看起来很长,但只是因为我已经拼出来了 - 如果你乐意去没有错误检查(你应该这样做,一旦它有效),这最多只能是几行。
立即窗口“正常工作”的原因是调试器在幕后为您完成所有这些操作。这样非常有帮助。
答案 1 :(得分:0)
我不确定您的原始请求是否可行,但我将采用的解决方案是创建一个接口来检索该属性,并让每个类实现此接口以返回该属性。我们在泛型类中广泛使用这种机制。