Domanda

Ho un fornitore di dati che contiene un insieme di entità. Voglio solo essere in grado di creare una nuova entità attraverso il provider di dati.

vale a dire, per creare un nuovo record ho bisogno di utilizzare:

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

Il mio problema è che se ho impostato i miei soggetti per interno, System.Activator non può creare un'istanza di loro. Ognuno dei miei fornitori di dati utilizza una classe di base con il tipo generico del soggetto passa attraverso.

Quindi al momento il mio metodo AddNew () contiene il seguente:

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

Non è, ovviamente, la fine del mondo se riesco a un'istanza di un nuovo soggetto manualmente al di fuori degli spazi dei nomi provider di dati, ma sembra inutile considerando che non c'è modo per salvarli mai, quindi perché danno la possibilità di farlo?

EDIT: Ho dimenticato di dire che tutti i miei fornitori, enti, ecc sono nello stesso spazio dei nomi

.
È stato utile?

Soluzione

Non utilizzare l'attivatore, che si basa su un costruttore pubblico. Invece utilizzare la reflection per trovare il costruttore senza parametri e quindi chiamarlo. Qualcosa in questo senso:

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top