2015-02-12 4 views
0

У меня есть эта статическая функция здесь, которая решает тип переданного параметра и вызывает на нем встроенный метод ToString(), если он является общим или вызывает предопределенный пользовательский посредник распечатать его полное содержимое, если оно может быть перечислино. Вот что я до сих пор;Переменная, определяемая как параметр в функции типа T undefined C#

public static String ToStringDecider<T> (T value) 
{ 
    Type t = typeof(value); 
    if (t.IsSubclassOf (Array) || t.IsSubclassOf (IList)) 
     return ToString_List (value); 
    else if (t.IsSubclassOf (IEnumerable)) 
     return ToString_Enumerable (value); 
    else if (t.IsSubclassOf (IDictionary)) 
     return ToString_Dictionary (value); 
    else 
     return value.ToString(); 
} 

Однако первое упоминание переменной value в строке 3 приходит с синтаксической ошибки с указанием "The name 'value' does not exist in the current context." Может кто-нибудь объяснить, почему это происходит?

+1

Вы попробовали 'value.GetType()'? – chouaib

+0

Почему не 'typeof()' достаточно? – Maurdekye

+0

Не должно быть typeof (T)? – Tuco

ответ

2

typeof не принимает переменную как аргумент, а скорее тип.

Вы хотите либо:

Type t = typeof(T); 
Type t = value.GetType(); 

Обратите внимание, что вы также, вероятно, потребуется явное приведение в вызовах методов хелперов.

+1

Ему также, скорее всего, придется изменить 't.IsSubclassOf (Array)' на 't.IsSubclassOf (typeof (Array))', а также для других сравнений. –

+0

Ждать; если 'typeof (Array)' возвращает _type_ 'Array', тогда какой тип объекта является' Array'? Все это очень запутывает. – Maurdekye

+1

@Maurdekye Тип массива - это ... Array. :) Но 'typeof()' или 'GetType()' возвращает экземпляр 'Type', который является классом, который позволяет вам получать доступ ко всем видам метаданных об определенном классе, интерфейсе и т. Д. Одна из вещей, которые вы делаете может сделать, это получить «Тип» двух разных классов и сравнить их, чтобы убедиться, что они равны (один и тот же класс). Я не знаю, помогает ли это объяснение или просто запутывается, но вы можете [читать больше здесь] (https://msdn.microsoft.com/en-us/library/system.type (v = vs.110) .aspx). –

Смежные вопросы