2013-11-12 5 views
1

Я потратил некоторое время на динамическое построение диаграммы сущностей с помощью Reflection.Emit. Создание сборки с новым плоским типом (классом), создание экземпляра и использование его с отражением легко и отлично. Но когда дело доходит до построения структуры с родовыми списками еще одного динамического класса, это становится сложнее, и я застрял. В принципе, я хотел бы построить следующую структуру динамически:Reflection.Emit Построение графа сущности

public class Head 
{ 
    public string HeadId { get; set; } 
    public AssignmentType HeadType { get; set; } 
    public int TestIndicator { get; set; } 
    public List<Item> Items { get; set; } 

    public Head() 
    { 
     Items = new List<Item>(); 
    } 
} 

public class Item 
{ 
    public string ItemId { get; set; } 
    public int Weight { get; set; } 
    public List<Description> Descriptions { get; set; } 

    public Item() 
    { 
     Descriptions = new List<Description>(); 
    } 
} 

public class Description 
{ 
    public string DescriptionText { get; set; } 
    public string Country { get; set; } 
} 

public enum AssignmentType 
{ 
    TypeA, 
    TypeB, 
    TypeC 
} 

искали многочисленные примеры, но до сих пор я ничего адресацию этого не нашел. Если у кого-то есть образец или я могу указать мне в правильном направлении, чтобы решить это, используя Reflection.Emit, это было бы очень признательно.

+2

Это может помочь, если вы показать некоторые из вашего кода испускают и где у вас возникли проблемы. –

+0

Считаете ли вы использование Activator.CreateInstance, если у вас есть определение времени разработки или динамическое ключевое слово или ExpandoObject, если у вас есть только определение времени выполнения? – Kaido

+1

Считаете ли вы подход более высокого уровня с использованием Roslyn или что-то в этом роде? Reflection.Emit, как правило, трудно получить. – svick

ответ

1

Самым простым решением является использование CSharpCodeProvider из Microsoft.CSharp имен:

string source = "public class Description" + 
        "{" + 
        " public string DescriptionText { get; set; }" + 
        " public string Country { get; set; }" + 
        "}"; 

    CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
    System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); 
    parameters.GenerateExecutable = false; 
    parameters.GenerateInMemory = true; 
    CompilerResults result = codeProvider.CompileAssemblyFromSource(parameters, source); 
    if (!result.Errors.HasErrors) 
    { 
     Type type = result.CompiledAssembly.GetType("Description"); 
     var instance = Activator.CreateInstance(type); 
    } 
+0

Спасибо за ваш ответ, я поеду за этим решением в своем проекте, это просто и сделает то, что мне нужно. По какой-то причине я проигнорировал возможности использования CodeDom, считая, что Reflection.Emit - это путь. Спасибо, что просветил меня. Я буду использовать это для создания объектов DTO во время выполнения, используя метаданные от поставщика, который использует сущность framework poco's. – Grovah

Смежные вопросы