Проверка параметра типа общего метода в C#

Это возможный сделать что-то вроде этого в 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
        ...
    }
}
56
задан valdetero 17 June 2015 в 17:30
поделиться

2 ответа

Да:

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, который одинаково работает для любого типа.

.
94
ответ дан 26 November 2019 в 17:19
поделиться
-

Я думаю, что что-то не так в вашем дизайне. Вы хотите сравнить типы по уже общему методу. Дженерики предназначены для работы с переменными типами. Я рекомендую сделать это таким образом...

//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>
{
    ...
}
3
ответ дан 26 November 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: