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, это будет очень ценно.

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);
    }
Другие вопросы по тегам