Как определить объект C # во время выполнения? - PullRequest
5 голосов
/ 09 февраля 2010

У нас есть 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();
}

Ответы [ 3 ]

9 голосов
/ 09 февраля 2010

Является ли ExpandoObject тем, что вы ищете?

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

3 голосов
/ 09 февраля 2010

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

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

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

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

Проверьте пример ссылки AssmblyBuilder .

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

EDIT:

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

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));
1 голос
/ 09 февраля 2010

РЕДАКТИРОВАТЬ: Это не относится к вопросу оригинального плаката.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...