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();
}
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
Vous devez vous connecter pour publier un commentaire.
Votre code tente de créer une instance de
DocumentLibraryRepository<IRepository<Document>>
au lieu deDocumentLibraryRepository<Document>
.Vous souhaitez utiliser ce code à la place:
OK. Merci de voir mon jour de réponse. Cela devrait résoudre votre problème.
Merci beaucoup, qui a fait le tour! Vous êtes un épargnant de vie 🙂
OriginalL'auteur Daniel Hilgarth
Cela donnerait à penser que peut-être vous avez utilisé un
where
contrainte sur le type génériqueDocumentLibraryRepository<T>
et que le typePerpetualDocument
ne correspond pas à cette contrainteOriginalL'auteur RobV
Peut-être que ma réponse peut aider quelqu'un ayant la même erreur.
Mon scénario est :
Donc, au moment de l'exécution lors de la méthode Run() est chargé (non exécuté) j'obtiens une exception:
GenericArguments[0] .... Système.EventHandler`1[TEventArgs]' Viole la contrainte du paramètre de type 'TEventArgs' .. sur la méthode Run().
Je ne sais pas si c'est un .NET bug, mais dans mon cas, j'ai RÉSOLU ce problème en changeant le type de TypedEvent propriété dans Une classe de tapé
EventHandler<B>
de Gestionnaire d'événements.Mon scénario:
Je souhaite que cela puisse aider quelqu'un.
OriginalL'auteur Alexei Bondarev