Задать значение в модели при динамическом создании объекта модели - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть куча моделей, которые могут иметь или не иметь свойство "CommonProperty". Я хочу установить это свойство при создании нового объекта выбранной модели. То, что я до сих пор работаю:

ModuleItem model = db.ModuleItems.Find(ModuleItemID);
object o = GetModuleType(model.ControllerName);

private object GetModuleType(string ModelName)
{
string projectName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;

Type classtype = Type.GetType(string.Format("{0}.Models.{1}", projectName, ModelName));
PropertyInfo[] properties = classtype.GetProperties();
var classObject = classtype.GetConstructor(new Type[] { }).Invoke(null);
return classObject;

}

Чего я хочу добиться, так это установить CommonProperty:

o.CommonProperty = DistinctValue;

Я попытался создать класс, от которого все мои модели наследуются виртуальным методом, и у каждой модели есть метод переопределения. Поскольку он не статичен, я не могу вызвать его напрямую, и если я создаю новый ModelBase, то при вызове метода он не переопределяется типом объекта "o". Я смотрел на создание интерфейса, но 1 я даже не знаю, как это работает, и 2 (вероятно, из-за 1) я даже не могу создать способ сделать это без ошибок сборки.

При переходе по коду я вижу все свойства «o», используя быструю кнопку или intellisense или как там это называется. Ясно, что он распознается как правильный тип. Кажется, я не могу вызвать метод, потому что он не является распознанным (или установленным) типом во время сборки только во время выполнения и, следовательно, я не могу построить решение.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2012

Как оказалось, я слишком задумался над этим. Как правило, ответ смехотворно прост. Не требуется никакой базовой модели, никаких переопределений, никаких виртуальных объектов, никаких экземпляров, создайте дамп в try catch и просто установите значение объекта контекста.

        object o = GetModuleType(model.ControllerName);
        db.Entry(o).State = EntityState.Added;
        try
        {
            db.Entry(o).CurrentValues["CommonProperty"] = DistinctValue;
        }
        catch (Exception err) { }

Мне нужно было убедиться, что я установил состояние ДО установки текущего значения, иначе это не было в контексте (или что-то в этом роде).

0 голосов
/ 03 апреля 2012

Что я хотел бы сделать, это создать базовую модель (например, BaseModel) для моделей представления, имеющих свойство CommonProperty, затем проверить, имеет ли модель тип BaseModel, затем установить свойство

if (obj is BaseModel)
{
   obj.CommonProperty = DistinctValue;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...