如何在运行时定义C#对象?

时间:2010-02-09 03:21:01

标签: c# dynamic object

我们将XML代码存储在单个关系数据库字段中以解决实体/属性/值数据库问题,但我不希望这会破坏我的域建模,DTO和存储库的阳光。我无法绕过EAV / CR内容,但我可以选择如何存储它。问题是我将如何使用它?

如何在C#中将XML元数据转换为运行时的类/对象?

例如:

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 个答案:

答案 0 :(得分:9)

ExpandoObject您要找的是什么?

  

表示其成员可以的对象   动态添加和删除   运行时间。

答案 1 :(得分:3)

查看System.Reflection.Emit命名空间。

您从AppDomain.CurrentDomain

开始使用AssemblyBuilder类
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));

答案 2 :(得分:1)

编辑:这不能解决原始海报的问题。

我认为使用XAML可以实现这一点。我将生成一个XAML文件,然后load it dynamically using XamlReader.Load()在运行时使用我想要的属性创建一个对象。

有一篇有趣的文章可以阅读XAML as an object serialization framework here的主题。有关XAML namespaces see here的更多信息。