C#反射来自通用基类中的字段的GetValue

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)

谢谢

use*_*107 0

我想问题出在泛型类是用特定类型动态编译的。泛型类型也可以这样定义

internal class ClassB<T>
{
    public T value;

    public string str;
    public ClassB(string s)
    {
        str = s;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么你在获取“value”字段的值时就会遇到问题。解决方法是使用 .GetType() 直接检索类型,或者创建一个不包含要访问的字段的通用参数的新基类。