我们将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();
}
答案 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的更多信息。