유형의 제약 조건을 위반합니다. 본질적으로 다음과 같이 호출되는 제네릭 저장소 팩토리를 구현하려고합니다. 잠시 동안 제 머리칼을 꺼내 왔습니다.Generics & Reflection - GenericArguments [0]이
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));
,536 실패 기능 :
var resposFactory = new RepositoryFactory<IRepository<Document>>();
저장소 공장은 다음과 같습니다
내가 오류는 다음과 같습니다
경우 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();
}
거기에 신고서가 누락 되었습니까? 그 방법의 완전한 사본을 붙여 넣었습니까? –
또한 매개 변수가있는 생성자를 명확하게 호출 할 때 매개 변수없는 생성자가 있는지 확인하는 이유는 무엇입니까? 매개 변수없는 생성자를 사용하면 'GetConstructors'에 의해 반환 된 0 번째 생성자가 될 가능성이 높습니다.이 경우 * 매개 변수를 * 매개 변수로 호출하면 실패합니다. –
예 죄송합니다 '반환 기본값 (T)'이 끝에 와야합니다. – Bevan