Frage

Ich habe einen Datenprovider bekommt, die eine Sammlung von Entitäten enthält. Ich möchte nur eine neue Einheit durch den Datenprovider erstellen können.

D.h., einen neuen Datensatz zu erstellen Ich brauche zu verwenden:

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

Mein Problem ist, dass, wenn ich meine Einheiten auf Internal eingestellt, System.Activator kann eine Instanz von ihnen nicht erstellen. Jeder meines Datenanbieters verwendet eine Basisklasse mit dem generischen Typ des Unternehmens durchlaufen.

So ist im Moment mein AddNew () -Methode enthält folgende Komponenten:

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

Es ist natürlich nicht das Ende der Welt, wenn ich eine neue Einheit manuell außerhalb des Data Provider Namespaces instanziieren kann, aber es scheint sinnlos angesichts kein Weg gibt es immer, sie zu retten, warum also die Möglichkeit geben, dies zu tun?

EDIT: Vergessen zu erwähnen, dass alle meine Anbieter, Organisationen, etc. im gleichen Namensraum sind

.
War es hilfreich?

Lösung

Sie den Activator nicht verwenden, die auf einem öffentlichen Konstruktor beruht. Verwenden Sie stattdessen Reflexion der parameterlosen Konstruktor zu finden und es dann nennen. Etwas in diese Richtung:

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top