2009-05-20 8 views
0

У меня есть поставщик данных, который содержит коллекцию объектов. Я только хочу, чтобы создать новый объект через поставщика данных.C# CF2.0 - System.Activator и внутренние классы

т.е., чтобы создать новую запись, мне нужно использовать:

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

Моя проблема заключается в том, что, если я изложу свои объекты для внутреннего, System.Activator не может создать экземпляр из них. Каждый из моих Data Providers использует базовый класс с общим типом передаваемого объекта.

Поэтому в данный момент мой метод AddNew() содержит следующее:

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

Это, очевидно, не конец света, если я могу создать экземпляр нового органа вручную вне поставщика данных пространств имен, но это, кажется, бессмысленно, потому что не существует способа спасти их, поэтому зачем им это делать?

EDIT: Забыл упомянуть, что все мои провайдеры, сущности и т. Д. Находятся в одном и том же пространстве имен.

ответ

0

Не используйте активатор, который опирается на открытый конструктор. Вместо этого используйте отражение, чтобы найти конструктор без параметров и затем вызвать его. Что-то в этих строках:

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