我一直在這一拉我的頭髮一段時間,本質上我試圖實現一個通用的知識庫工廠,這是所謂的如下:泛型和反射 - GenericArguments [0]違反類型約束
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();
}
您是否錯過了那裏的退貨聲明?您是否粘貼了該方法的完整副本? –
另外,當你打算用參數調用構造函數時,爲什麼要檢查無參數構造函數的存在?如果你有一個無參數的構造函數,它最有可能是由'GetConstructors'返回的第0個構造函數,在這種情況下用*參數調用*將失敗。 –
對不起'返回默認(T)'應該在最後。 – Bevan