Я потянул свои волосы на некоторое время на этом, по сути, я пытаюсь реализовать универсальную фабрику репозитория, которая называется следующим образом:
var resposFactory = new RepositoryFactory<IRepository<Document>>();
Фабрика репозитория выглядит какследующее:
public class RepositoryFactory<T> : IRepositoryFactory<T>
{
public T GetRepository(Guid listGuid,
IEnumerable<FieldToEntityPropertyMapper> fieldMappings)
{
Assembly callingAssembly = Assembly.GetExecutingAssembly();
Type[] typesInThisAssembly = callingAssembly.GetTypes();
Type genericBase = typeof (T).GetGenericTypeDefinition();
Type tempType = (
from type in typesInThisAssembly
from intface in type.GetInterfaces()
where intface.IsGenericType
where intface.GetGenericTypeDefinition() == genericBase
where type.GetConstructor(Type.EmptyTypes) != null
select type)
.FirstOrDefault();
if (tempType != null)
{
Type newType = tempType.MakeGenericType(typeof(T));
ConstructorInfo[] c = newType.GetConstructors();
return (T)c[0].Invoke(new object[] { listGuid, fieldMappings });
}
}
}
Когда я пытаюсь вызвать функцию GetRespository, происходит сбой следующей строки
Type newType = tempType.MakeGenericType(typeof(T));
Я получаю ошибку:
ArgumentException - GenericArguments[0], «Framework.Repositories.IRepository`1 [Apps.Documents.Entities.PerpetualDocument]» в «Framework.Repositories.DocumentLibraryRepository`1 [T]» нарушает ограничение типа «T».
Есть идеи о том, что здесь происходит не так?
РЕДАКТИРОВАТЬ:
Реализация хранилища выглядит следующим образом:
public class DocumentLibraryRepository<T> : IRepository<T>
where T : class, new()
{
public DocumentLibraryRepository(Guid listGuid, IEnumerable<IFieldToEntityPropertyMapper> fieldMappings)
{
...
}
...
}
И IRepository выглядит следующим образом:
public interface IRepository<T> where T : class
{
void Add(T entity);
void Remove(T entity);
void Update(T entity);
T FindById(int entityId);
IEnumerable<T> Find(string camlQuery);
IEnumerable<T> All();
}