Создание общего метода и использование параметра типа

Я создал этот метод, который является объектной фабрикой:

public static T GetService<T>(T serviceInterface)
{
    if (serviceInterface.Equals(typeof(IMemberService)))
    {
        return (T)(object)new MemberService();
    }
    else if (serviceInterface.Equals(typeof(ILookupService)))
    {
        return (T)(object)new LookupService();
    }
    throw new ArgumentOutOfRangeException("No action is defined for service interface " + serviceInterface.Name);
}

Теперь, я хотел бы пойти далее и избавить от необходимости "serviceInterface" параметр, но моя проблема - я не знаю, как сравнить параметр типа T с интерфейсом: выполнение

T.Equals(typeof(ILookupService)) 

дает ошибку компилятора: 'T' является 'параметром типа', который не допустим в данном контексте.

Какие-либо идеи, как я мог сравнить параметр типа с интерфейсом?

Спасибо, Andrey

10
задан Andrey 17 February 2010 в 22:59
поделиться

4 ответа

Вы можете использовать typeof (T) , чтобы получить обратно объект Type , который может заменить использование serviceInterface

Например

public static T GetService<T>()
{
    Type serviceInterface = typeof(T);
    if (serviceInterface.Equals(typeof(IMemberService)))
    {
        return (T)(object)new MemberService();
    }
    else if (serviceInterface.Equals(typeof(ILookupService)))
    {
        return (T)(object)new LookupService();
    }
    throw new ArgumentOutOfRangeException("No action is defined for service interface " + serviceInterface.Name);
}
10
ответ дан 3 December 2019 в 23:49
поделиться

Используйте typeof (T) .

Итак,

typeof(T).Equals(typeof(ILookupService))
1
ответ дан 3 December 2019 в 23:49
поделиться
if (typeof(IMemberService).IsAssignableFrom(typeof(T)))
{}
else if (typeof(ILookupService).IsAssignableFrom(typeof(T)))
{}
1
ответ дан 3 December 2019 в 23:49
поделиться

Может ли здесь быть применим оператор is?

1
ответ дан 3 December 2019 в 23:49
поделиться
Другие вопросы по тегам:

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