问题是我们无法获取仅存在于具有泛型类型的基类中的字段(非泛型)的值。 请看下面的代码片段。呼唤
f.GetValue(a)
将抛出异常消息:后期绑定(bind)操作不能在类型为 Type.ContainsGenericParameters 为真的字段上执行。
class Program
{
static void Main(string[] args)
{
Type abstractGenericType = typeof (ClassB<>);
FieldInfo[] fieldInfos =
abstractGenericType.GetFields(BindingFlags.Public | BindingFlags.Instance);
ClassA a = new ClassA("hello");
foreach(FieldInfo f in fieldInfos)
{
f.GetValue(a);// throws InvalidOperationhException
}
}
}
internal class ClassB<T>
{
public string str;
public ClassB(string s)
{
str = s;
}
}
internal class ClassA : ClassB<String>
{
public ClassA(string value) : base(value)
{}
}
我们的设计要求我们在拥有实际对象的任何实例之前首先获取 FieldInfo。所以我们不能使用
Type typeA = abstractGenericType.MakeGenericType(typeof(string));
FieldInfo[] fieldInfos = typeA.GetFields();
谢谢
最佳答案
我想问题出在这一点上,泛型类是用特定类型动态编译的。泛型也可以这样定义
internal class ClassB<T>
{
public T value;
public string str;
public ClassB(string s)
{
str = s;
}
}
那么您在获取字段“value”的值时会遇到问题。变通方法是使用 .GetType() 直接检索类型,或者创建一个新的基类,而不使用包含您要访问的字段的通用参数。
关于C# 从泛型基类中的字段反射 GetValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11442812/