C# CF2.0 - System.Активатор и внутренние классы
-
23-08-2019 - |
Вопрос
У меня есть поставщик данных, который содержит коллекцию объектов.Я только хочу иметь возможность создать новый объект через поставщика данных.
Т.е. для создания новой записи мне нужно использовать:
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);