如何用反射调用泛型类型的属性/字段

本文关键字:属性 字段 泛型类型 何用 反射 调用 | 更新日期: 2023-09-27 17:51:22

考虑以下类

class A<T> where T:new()
{
  public static T Instance = new T();
  A()
  {
  }
}

我有两个问题

  1. 我需要Instance对象与反射。我已经试着遵循

    var type = typeof(A<int>);  
    // var type = typeof(A<>).MakeGenericType(typeof(int)); // Also tried this
    var instanceMember1 = type.GetMember("Instance",  BindingFlags.Static );  // returns null
    var instanceMember2 = type.GetField("Instance",  BindingFlags.Static ); // returns null
    

    我也尝试将Instance更改为属性并调用GetProperty,但没有成功。

  2. 解除new()约束,使constructor私有后,如何通过反射调用私有(无参数)构造函数

如何用反射调用泛型类型的属性/字段

BindingFlags.Public添加到GetField的标志中。

var instanceMember1 = type.GetField("Instance", BindingFlags.Static |
    BindingFlags.Public);

调用私有构造函数:

var ctor = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, 
    null, Type.EmptyTypes, new ParameterModifier[0]);
var instance = ctor.Invoke(null) as A<int>;