use*_*274 6 c# generics reflection fieldinfo
问题是我们不能得到只存在于具有泛型类型的基类的字段(非泛型)的GetValue.请参阅下面的代码段.调用
f.GetValue(a)
Run Code Online (Sandbox Code Playgroud)
将抛出带有消息的异常:无法对Type.ContainsGenericParameters为true的类型的字段执行后期绑定操作.
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)
{}
}
Run Code Online (Sandbox Code Playgroud)
我们的设计要求我们在拥有实际对象的任何实例之前首先获得FieldInfo.所以我们不能使用
Type typeA = abstractGenericType.MakeGenericType(typeof(string));
FieldInfo[] fieldInfos = typeA.GetFields();
Run Code Online (Sandbox Code Playgroud)
谢谢
我想问题出在泛型类是用特定类型动态编译的。泛型类型也可以这样定义
internal class ClassB<T>
{
public T value;
public string str;
public ClassB(string s)
{
str = s;
}
}
Run Code Online (Sandbox Code Playgroud)
那么你在获取“value”字段的值时就会遇到问题。解决方法是使用 .GetType() 直接检索类型,或者创建一个不包含要访问的字段的通用参数的新基类。
| 归档时间: |
|
| 查看次数: |
2037 次 |
| 最近记录: |