Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top