C # CF2.0 - System.Activator и внутренние классы - PullRequest
0 голосов
/ 20 мая 2009

У меня есть поставщик данных, который содержит коллекцию сущностей. Я только хочу иметь возможность создавать новую сущность через поставщика данных.

Т.е., для создания новой записи мне нужно использовать:

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

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

Итак, на данный момент мой метод AddNew () содержит следующее:

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

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

РЕДАКТИРОВАТЬ: Забыл упомянуть, что все мои провайдеры, организации и т. Д. Находятся в одном пространстве имен.

1 Ответ

0 голосов
/ 20 мая 2009

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

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