2013-09-23 2 views
3

Быстрый один здесь ~ Я хочу, чтобы преобразовать < T> ToString, так что я могу заменить переменную этого типа ~C# generics: Можете ли вы преобразовать <T> ToString?

public void ChangePanel<T>(T Action){ 

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

Кроме того, пожалуйста, дайте мне знать, если есть лучший способ сделать это !!

Edit: 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(). – Burdock

5

Да. ToString() определен в классе object, из которого все происходит, поэтому я ожидаю, что вы можете называть его любым типом T. Однако вам нужно называть его самим параметром, а не типом, поэтому вместо T.ToString() вы должны делать Action.ToString(). Если вы хотите получить имя типа, тогда вы должны использовать отражение, а не ToString.

Также возможны варианты отражения;

typeof(T).Name 

или

Action.GetType().Name 
+1

Да, T - это тип, а не объект –

+0

@ Valamas-AUS Да, я вносил исправление, чтобы исправить эту ошибку. – evanmcdonnal

+0

@Silvermind T - параметр типа. Это не экземпляр, если бы я сказал класс 'Person' с перегруженным методом ToString(), который возвращал имя и фамилию человека, вызывающие' ToString() 'на' T', не имели бы желаемого эффекта возвращая первое и фамильное имя, я должен был бы вызвать его на примере, о котором говорит Валамас. T на самом деле является типом. В Generics в C# вам нужно указать тип внутри символов '<>' (в некоторых случаях это может быть выведено, но это основная идея). – evanmcdonnal

0

ToString метод представляет собой метод, так что вам нужно скобки, чтобы назвать его, и так важно для идентификаторов:

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

GetField является метод класса Type, поэтому вам нужно typeof, чтобы получить Type объект для T общий тип.

1

Если вы хотите, чтобы получить имя универсального типа, то вы можете просто позвонить typeof(T).Name:

public static string GetGenericTypeName<T>() 
{ 
    return typeof(T).Name; 
} 
Смежные вопросы