2010-11-24 3 views
0

Следующие программные выходы «У нас есть что-то еще». Как правильно определить тип данных передаваемого типа?Определение типов с генериками

+0

Что вы пытаетесь выполнить, точно? Вы хотите, чтобы у нас была строка? – strager 2010-11-24 01:44:26

ответ

4

Используйте ключевое слово is.

if(aType is string) 
    Console.WriteLine("We have a string"); 
else 
    Console.WriteLine("We have something else"); 

Одна вещь, чтобы обратить внимание при использовании такого рода логики в том, что is возвращает истину для супер-типов, которые могут привести к неожиданному поведению:

if(myObj is object) 
    Console.WriteLine("This will always print"); 
else if(myObj is int) 
    Console.WriteLine("This will never print"); 
+0

Это не работает – 2010-11-24 01:40:33

+2

В вашем примере вы передаете `Type` не` string`, поэтому он «не работает». – 2010-11-24 01:41:55

2

Если вы ищете тип из (небольшого) конечного списка, вы можете использовать 'is'.

0

typeof(string) возвращает Type.

Поэтому компилятор сообщает, что вы намереваетесь позвонить AFunction<Type>(typeof(string)).

GetType возвращает Type, представляющий тип Type для экземпляра Type.

typeof(Type) не равно typeof(string), поэтому результат в точности соответствует ожидаемому.


вы имели в виду

AFunction<string>("Hello World"); 

void AFunction<T>(T value) 
{ 
    if (value is string) ... 
} 

или

AFunction(typeof(string)); 

void AFunction(Type type) 
{ 
    if (type == typeof(string)) ... 
} 

или

AFunction<string>(); 

void AFunction<T>() 
{ 
    if (typeof(T) == typeof(string)) ... 
} 

?

0

Используя текущие вызовы, которые могли бы сделать что-то подобное прекращение функции следующим образом:

void AFunction<T>(T aType) 
{ 
    if ((aType as Type).Name == "String") 
    { 
     Console.WriteLine("We have a string"); 
    } 
    else 
    { 
     Console.WriteLine("We have something else"); 
    } 
} 
1

Я думаю, вам не нужно использовать Generic Type в этом обстоятельстве. Вы просто отправить тип объекта в прекращение функции, а затем использовать is ключевое слово следующим образом:

void AFunction(Object aType) 
{ 
    if (aType is string) { 

     Console.WriteLine ("We have a string"); 

    } else { 
     Console.WriteLine ("We have something else"); 
    } 
} 

Кстати, я думаю, что Родовой тип не для такого использования.

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