Как определить объект C# во время выполнения?

Нам сохранили код XML в единственном поле реляционной базы данных для обхождения проблем базы данных Entity / Attribute / Value, однако я не хочу, чтобы это разрушило мое Доменное Моделирование, DTO и солнечный свет Репозитория. Я не могу обойти содержание EAV/CR, но я могу выбрать, как сохранить его. Вопрос состоит в том, как я использовал бы его?

Как я мог повернуть метаданные XML в к классу / объект во время выполнения в C#?

Например:

XML описал бы, что у нас есть продовольственный рецепт, который имеет различные атрибуты, но обычно подобный, и один или несколько атрибутов о создании еды. Сама еда может буквально быть чем-либо и иметь любой тип сумасшедшей подготовки. Все атрибуты ищутся и могут связаться с существующей пищевой информацией.

// <-- [Model validation annotation goes here for MVC2]
public class Pizza {
     public string kind  {get; set;}
     public string shape {get; set;}
     public string city  {get; set;}
     ...
}

и в ActionMethod:

makePizzaActionMethod (Pizza myPizza) {
    if (myPizza.isValid() ) {  // this is probably ModelState.isValid()...
        myRecipeRepository.Save( myPizza);
        return View("Saved");
    }
    else
        return View();
}
5
задан Zachary Scott 9 February 2010 в 03:21
поделиться

3 ответа

Вы ищете ExpandoObject ?

Представляет объект, члены которого могут динамически добавляться и удаляться во время выполнения .

9
ответ дан 18 December 2019 в 14:45
поделиться

Проверьте пространство имен System.Reflection.Emit .

Вы начинаете с класса AssemblyBuilder из AppDomain.CurrentDomain

AssemblyBuilder dynAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly("dynamic.dll",
                                                                            AssemblyBuilderAccess.RunAndSave);

Оттуда вам нужно построить ModuleBuilder, из которого вы можете построить TypeBuilder.

См. Пример в ссылке AssmblyBuilder .

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

РЕДАКТИРОВАТЬ:

Ниже приведен пример перебора свойств:

AssemblyName aName = new AssemblyName("dynamic");
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder mb = ab.DefineDynamicModule("dynamic.dll");
TypeBuilder tb = mb.DefineType("Pizza");
//Define your type here based on the info in your xml
Type theType = tb.CreateType();

//instanciate your object
ConstructorInfo ctor = theType.GetConstructor(Type.EmptyTypes);
object inst = ctor.Invoke(new object[]{});

PropertyInfo[] pList = theType.GetProperties(BindingFlags.DeclaredOnly);
//iterate through all the properties of the instance 'inst' of your new Type
foreach(PropertyInfo pi in pList)
    Console.WriteLine(pi.GetValue(inst, null));
3
ответ дан 18 December 2019 в 14:45
поделиться

EDIT: Это не касается вопроса оригинального плаката.

Я думаю, что это возможно с использованием XAML. Я бы сгенерировал XAML файл, а затем загрузил бы его динамически, используя XamlReader.Load(), создал бы объект во время выполнения со свойствами, которые мне нужны.

Здесь есть интересная статья на тему XAML как фреймворка сериализации объектов. Для дополнительной информации о XAML пространствах имён смотрите здесь.

1
ответ дан 18 December 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: