Les génériques & Réflexion - GenericArguments[0] viole la contrainte de type

J'ai été en tirant sur mes cheveux pendant un certain temps sur ce, essentiel, je suis en train de mettre en œuvre un référentiel générique de l'usine, qui est appelée comme suit:

var resposFactory = new RepositoryFactory<IRepository<Document>>();

Le référentiel de l'usine se présente comme suit:

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 });
        }
    }
}

Quand j'essaie d'appeler le GetRespository fonction de la ligne suivante échoue

Type newType = tempType.MakeGenericType(typeof(T));

L'erreur que j'obtiens est :

ArgumentException - GenericArguments[0], 'Cadre.Les référentiels.IRepository`1[Apps.Documents.Les entités.PerpetualDocument]', 'Cadre.Les référentiels.DocumentLibraryRepository`1[T]' viole la contrainte de type "T".

Toutes les idées sur ce qui ne va pas ici?

EDIT:

La mise en œuvre du référentiel est comme suit:

public class DocumentLibraryRepository<T> : IRepository<T>
                                                where T : class, new()
{
   public DocumentLibraryRepository(Guid listGuid, IEnumerable<IFieldToEntityPropertyMapper> fieldMappings)
   {
        ...
   }

   ...
}

Et la IRepository ressemble:

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();
    }
Êtes-vous manque une instruction de retour là-bas? Ne vous collez une copie complète de cette méthode?
Aussi, pourquoi êtes-vous de vérifier la présence d'un constructeur sans paramètre si vous avez l'intention d'invoquer un constructeur avec paramètres? Si vous avez un constructeur sans paramètre, il est plus susceptible d'être le 0e constructeur retourné par GetConstructors, auquel cas l'appel de avec paramètres échouera.
Oui désolé "de retour par défaut(T)" devrait être à la fin.
En ce qui concerne la vérification pour le constructeur sans paramètre? Ce que vous dites est correct, j'étais en train de jouer pour voir si je faisais quelque chose de mal tbh.

OriginalL'auteur Bevan | 2011-09-14