2013-09-23 43 views
3

快速一個〜 我想轉換< T>的ToString這樣我就可以與該類型〜替換變量C#泛型:你可以轉換<T> ToString?這裏

public void ChangePanel<T>(T Action){ 

    FieldInfo Field = T.GetField(T.toString); 
    Field.SetValue(SomeObject, Action); 
} 

也請讓我知道,如果有更好的方法來做到這一點!

編輯:FYI在SomeObject變量具有相同的名稱,類型

+3

它不清楚你試圖實現什麼 – scartag

+1

T.toString?也許嘗試T.ToString() –

+0

是的,這應該工作 –

回答

8

可以使用typeof Keyword獲得Type實例和Type.Name Property要獲得類型的名稱。

public void ChangePanel<T>(T action) 
{ 
    Type typeOfObject = someObject.GetType(); 
    Type typeOfAction = typeof(T); 

    FieldInfo field = typeOfObject.GetField(typeOfAction.Name); 
    field.SetValue(someObject, action); 
} 
+0

謝謝,先生!雖然我不能刪除泛型,只是使用「Action.GetType()。Name」? – Burdock

5

是。 ToString()是在object類一切從派生定義,因此我希望你可以把它在任何類型T。但是,您需要在參數本身上調用它,而不是類型,所以您應該做而不是Action.ToString()。如果你想獲得類型的名稱,那麼你應該使用反射而不是ToString

此外,反射選項要麼;

typeof(T).Name 

Action.GetType().Name 
+1

是,T是一個類型,而不是對象 –

+0

@ Valamas-AUS是的,我是在一個編輯將糾正這個錯誤。 – evanmcdonnal

+0

@Silvermind T是一個類型參數。這不是實例,如果我用一個重載的ToString()方法說出一個Person類,它返回了在T上調用'ToString()'的人的名字和姓氏,將不會產生預期的效果返回名字和姓氏,我必須在Valamas所說的實例上調用它。 T實際上是一種類型。 C#中的泛型要求您在'<>'符號內指定類型(在某些情況下可以實際推斷它,但這是基本思想)。 – evanmcdonnal

0

ToString方法是一種方法,所以你需要括號調用它,情況是很重要的標識符:

FieldInfo Field = (typeof T).GetField(Action.ToString()); 

GetField是一種方法,在Type類的,所以你需要typeof得到了T泛型類型的Type對象。

1

如果你想獲得一個泛型類型的名稱,那麼你可以簡單地調用typeof(T).Name

public static string GetGenericTypeName<T>() 
{ 
    return typeof(T).Name; 
}