Question

J'ai un fournisseur de données qui contient une collection d'entités. Je veux seulement être en mesure de créer une nouvelle entité par le fournisseur de données.

i.e., pour créer un nouveau record que je dois utiliser:

Entity entity = Provider.AddNew();
enity.set_Properties... etc

Mon problème est que si je mets mes entités internes, System.Activator ne peut pas créer une instance d'entre eux. Chacun de mes fournisseurs de données utilise une classe de base avec le type générique de l'entité passé par.

Alors, au moment de ma méthode AddNew () contient les éléments suivants:

public T AddNew()
{
  T added = Activator.CreateInstance<T>();
  this.Collection.Add(added);
  return added;
}

Il est évidemment pas la fin du monde si je peux instancier une nouvelle entité manuellement en dehors des espaces de noms du fournisseur de données, mais il semble inutile vu qu'il n'y a aucun moyen de jamais les sauver, alors pourquoi donner la possibilité de le faire?

EDIT: Vous avez oublié de mentionner que tous mes fournisseurs, entités, etc sont dans le même espace

.
Était-ce utile?

La solution

Ne pas utiliser le Activator, qui repose sur un constructeur public. Au lieu d'utiliser la réflexion pour trouver le constructeur puis parameterless appeler. Quelque chose le long de ces lignes:

Type t = typeof(MyType);
var parameterlessCtor = (from c in t.GetConstructors(
  BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
    where c.GetParameters().Length == 0
    select c).FirstOrDefault;
if(parameterlessCtor != null) instance = parameterlessCtor.Invoke(null);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top