2013-01-11 71 views
1

調用泛型類型的屬性/字段考慮以下如何使用反射

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

類我有2個問題

  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私有,如何通過反射調用私有(無參數)構造函數。

回答

1

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>;