C# CF2.0 - System.Activator и внутренние классы
У меня есть поставщик данных, который содержит коллекцию сущностей. Я только хочу иметь возможность создать новую сущность через поставщика данных.
Т.е. для создания новой записи мне нужно использовать:
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;
}
Очевидно, что это не конец света, если я могу создать новую сущность вручную вне пространств имен провайдера данных, но это кажется бессмысленным, учитывая, что нет способа их когда-либо сохранить, так зачем давать такую возможность?
РЕДАКТИРОВАТЬ: Забыл упомянуть, что все мои провайдеры, организации и т. Д. Находятся в одном пространстве имен.
1 ответ
Не используйте Активатор, который опирается на открытый конструктор. Вместо этого используйте отражение, чтобы найти конструктор без параметров, а затем вызвать его. Что-то вроде этого:
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);