2009-05-20 7 views
0

J'ai un fournisseur de données qui contient une collection d'entités. Je veux seulement pouvoir créer une nouvelle entité par l'intermédiaire du fournisseur de données.C# CF2.0 - Classes System.Activator et Internal

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ée.

Ainsi, 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 les sauver, alors pourquoi donner l'option de le faire?

EDIT: J'ai oublié de mentionner que tous mes fournisseurs, entités, etc. sont dans le même espace de noms. Ne pas utiliser l'activateur, qui repose sur un constructeur public.

Répondre

0

Utilisez plutôt la réflexion pour trouver le constructeur sans paramètre, puis appelez-le. Quelque chose de ce genre:

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); 
Questions connexes