Вот возможная реализация для GetDocumentService.
public static IDocumentService<TDto> GetDocumentService<TDto>()
{
// Gets the type for IDocumentService
Type tDto=typeof(IDocumentService<TDto>);
Type tConcrete=null;
foreach(Type t in Assembly.GetExecutingAssembly().GetTypes()){
// Find a type that implements tDto and is concrete.
// Assumes that the type is found in the executing assembly.
if(tDto.IsAssignableFrom(t) && !t.IsAbstract && !t.IsInterface){
tConcrete=t;
break;
}
}
// Create an instance of the concrete type
object o=Activator.CreateInstance(tConcrete);
return (IDocumentService<TDto>)o;
}
Не было ясно, хотите ли вы вернуть новый объект, поэтому я предположил, что так.
EDIT:
Из-за вашего комментария, здесь есть модифицированная версия GetDocumentService. Недостатком является то, что вам нужно указать другой тип параметра. Однако преимущество заключается в том, что этот подход обеспечивает определенную степень безопасности типов, поскольку оба параметра типа должны быть совместимы.
public static T GetDocumentService<TDto, T>() where T : IDocumentService<TDto>
{
// Gets the type for IDocumentService
Type tDto=typeof(T);
Type tConcrete=null;
foreach(Type t in Assembly.GetExecutingAssembly().GetTypes()){
// Find a type that implements tDto and is concrete.
// Assumes that the type is found in the calling assembly.
if(tDto.IsAssignableFrom(t) && !t.IsAbstract && !t.IsInterface){
tConcrete=t;
break;
}
}
// Create an instance of the concrete type
object o=Activator.CreateInstance(tConcrete);
return (T)o;
}
РЕДАКТИРОВАТЬ 2:
Если я правильно понимаю, вы хотите, чтобы другие интерфейсы были реализованы по типу возвращаемого значения GetDocumentService. Например, GetDocumentService<CommentDto>
возвращает объект типа CommentService
, который реализует интерфейс ICommentService
. Если я правильно понимаю, возвращаемое значение должно быть объектом Type (например, возвращаемое значение может быть typeof(ICommentService)
). Когда у вас есть тип, вы должны вызвать свойство FullName
типа, чтобы получить имя типа.
Используйте следующий метод для возвращаемого значения GetDocumentService
, чтобы получить тип интерфейса, реализованного этим значением, например, typeof(ICommentService)
.
public static Type GetDocumentServiceType<TDto>(IDocumentService<TDto> obj){
Type tDto=typeof(IDocumentService<TDto>);
foreach(Type iface in obj.GetType().GetInterfaces()){
if(tDto.IsAssignableFrom(iface) && !iface.Equals(tDto)){
return iface;
}
}
return null;
}