当类是泛型时,从类中获取共享成员?

时间:2011-11-04 12:28:47

标签: .net vb.net generics

我有一堆类都包含Shared ReadOnly字典。如果我想在类是泛型类型时访问该Dictionary(例如当我有一个包装器函数将T作为所有这些类实现的接口时),那么它的方法是什么?

基础研究表明我想做GetType(T).GetMember("Dict")之类的事情,但是会返回MemberInfo类型,并且不能转换为我定义类型的字典。要以这种方式调用函数,可以使用委托+ CreateDelegate + GetMethod。但GetMember的东西似乎没有等价的Create*。或者我错过了什么?

如果我将GetMember调用插入到即时窗口中,然后使用下标就好像它是一个数组一样,那么调试输出就说我得到了一个字典。但是如果我在我想写的实际函数中使用相同的方法,那么我得到一个关于System.Reflection.MemberInfo的错误无法转换为Dictionary(X,Y)

2 个答案:

答案 0 :(得分:2)

你快到了。

GetMember返回您传递的所有成员的数组(您可以传递包含通配符*的字符串并返回多个成员)。因此,在这种情况下,您必须索引返回值以获得所需的实际MemberInfo

然后,为了对其执行任何操作,您需要将其转换为实际的-Info类型,在本例中为FieldInfo

获得FieldInfo后,您可以在其上调用GetValue以获取该字段的实际值。您需要将Nothing传递给GetValue,因为该字段是共享的,因此您希望获取此字段值的“实例”根本不是实例。

最后,您需要将GetValue的返回值强制转换为实际字典类型,因为它的类型为Object

然后你可以查看你的字典。

这可能看起来很长,但只是因为我已经拼出来了 - 如果你乐意去没有错误检查(你应该这样做,一旦它有效),这最多只能是几行。

立即窗口“正常工作”的原因是调试器在幕后为您完成所有这些操作。这样非常有帮助。

答案 1 :(得分:0)

我不确定您的原始请求是否可行,但我将采用的解决方案是创建一个接口来检索该属性,并让每个类实现此接口以返回该属性。我们在泛型类中广泛使用这种机制。