C# 从泛型基类中的字段反射 GetValue

标签 c# generics reflection fieldinfo

问题是我们无法获取仅存在于具有泛型类型的基类中的字段(非泛型)的值。 请看下面的代码片段。呼唤

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/

相关文章:

c# - 如何将自定义构建参数添加到 Visual Studio 2013 C# 项目?

c# - 使用 Sync Framework 自定义架构

asp.net - 传递通用列表

Java-又叫什么: <String> <>

Java:在嵌套参数化类型中获取内部类型(反射)

c# - 编译时检查 Action 链接到 Controller 方法

java - 为什么 List<String> 不能同时作为基类泛型方法和派生类非泛型方法的参数?

c# - 为什么 GetProperty 找不到它?

java - IntelliJ无法在Scala中识别TypeTag

C#解构和重载