Это возможный сделать что-то вроде этого в C#:
public void DoSomething<T>(T t)
{
if (T is MyClass)
{
MyClass mc = (MyClass)t
...
}
else if (T is List<MyClass>)
{
List<MyClass> lmc = (List<MyClass>)t
...
}
}
Да:
if (typeof(T) == typeof(MyClass))
{
MyClass mc = (MyClass)(object) t;
}
else if (typeof(T) == typeof(List<MyClass>))
{
List<MyClass> lmc = (List<MyClass>)(object) t;
}
Немного странно, что вам нужно пройти через приведение к объекту, но так работают генерики - приведений от общего типа не так много, как можно было бы ожидать.
Конечно, другой вариант - использовать обычную проверку времени выполнения:
MyClass mc = t as MyClass;
if (mc != null)
{
// ...
}
else
{
List<MyClass> lmc = t as List<MyClass>;
if (lmc != null)
{
// ...
}
}
Она будет вести себя иначе, чем первый блок кода, если t
будет, конечно же, нулевым.
Я бы попробовал по возможности избежать такого кода - иногда это может быть необходимо, но идея общих методов заключается в том, чтобы иметь возможность писать код generic, который одинаково работает для любого типа.
.Я думаю, что что-то не так в вашем дизайне. Вы хотите сравнить типы по уже общему методу. Дженерики предназначены для работы с переменными типами. Я рекомендую сделать это таким образом...
//Generic Overload 1
public void DoSomething<T>(T t)
where T : MyClass
{
...
}
//Generic Overload 2
public void DoSomething<T>(T t)
where T : List<MyClass>
{
...
}