Создание универсального метода и использование параметра типа - PullRequest
8 голосов
/ 18 февраля 2010

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

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» является «параметром типа», который недопустим в данном контексте.

Есть идеи, как сравнить параметр типа с интерфейсом?

Спасибо, Андрей

Ответы [ 4 ]

9 голосов
/ 18 февраля 2010

Вы можете использовать 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);
}
1 голос
/ 18 февраля 2010
if (typeof(IMemberService).IsAssignableFrom(typeof(T)))
{}
else if (typeof(ILookupService).IsAssignableFrom(typeof(T)))
{}
1 голос
/ 18 февраля 2010

Использование typeof(T).

Итак,

typeof(T).Equals(typeof(ILookupService))
0 голосов
/ 18 февраля 2010

Может ли здесь использоваться оператор is ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...