[英]C# reflection GetValue from a field in generic base class
问题是我们不能得到只存在于具有泛型类型的基类的字段(非泛型)的GetValue。 请参阅下面的代码段。 调用
f.GetValue(a)
将抛出带有消息的异常:无法对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)
{}
}
我们的设计要求我们在拥有实际对象的任何实例之前首先获得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;
}
}
那么你在获取字段“值”的值时会遇到问题。 变通办法将使用.GetType()直接检索类型,或创建一个没有包含您要访问的字段的泛型参数的新基类。
如果您灵活并且愿意使用属性而不是字段,则可以通过在泛型基类上放置非泛型接口来完成您想要的操作。 这是原始代码的重新分解版本,显示了变化和概念。
class Program
{
public static void Main(string[] args)
{
Type interfaceType = typeof(IGetStr);
PropertyInfo[] propertyInfos = interfaceType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
ClassA a = new ClassA("hello");
foreach (PropertyInfo p in propertyInfos)
{
var myValue = p.GetValue(a, null); // does not throw InvalidOperationException
}
}
}
internal interface IGetStr
{
string StringValue { get; set; }
}
internal class ClassB<T> : IGetStr
{
public string str;
public ClassB(string s)
{
str = s;
}
public string StringValue
{
get
{
return str;
}
set
{
str = value;
}
}
}
internal class ClassA : ClassB<String>
{
public ClassA(string value)
: base(value)
{ }
}
接口是访问泛型类的非泛型属性的好方法。 使用如图所示的接口,只要使用IGetStr的接口,就可以获得任何继承自ClassB <>的类的名为“StringValue”的属性,而不管泛型类型如何。
您也可以将“ClassA”对象转换为IGetStr,以下内容将起作用。 (非常适合所有从您的通用基础继承的项目列表)
var result = ((IGetStr)a).StringValue;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.