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);
}