Я создал этот метод, который является объектной фабрикой:
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
Вы можете использовать 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);
}
Используйте typeof (T)
.
Итак,
typeof(T).Equals(typeof(ILookupService))
if (typeof(IMemberService).IsAssignableFrom(typeof(T)))
{}
else if (typeof(ILookupService).IsAssignableFrom(typeof(T)))
{}