0

如何从反射中获得匿名类的实例?

我有这个字符串:
"<object name='hello' id='654' />"

具有不确定的属性参数编号(和名称),我想要一个匿名类的实例,该实例具有属性和属性以及属性值和属性值之间的映射。

var anObject = new{name="hello",id=654};

我采用了字符串的 xml 格式来说明我的话,但我需要任何字符串格式的解决方案(我不想 Xml 序列化)。

对于 Reed Copsey(请在我需要的地方抽象出上下文)。我打算用它来将 DefaultRoute 注入到 asp.net MVC 3 应用程序的映射路由中

 routes.MapRoute(
        "",
        "superweirdurlwithnostructure.whatever",
        new { controller = "Home", action = "Products", id = 500 }
    );

参考我的问题文件以在 MVC3 中定义路由

4

2 回答 2

2

你不能以这种方式创建一个匿名类(至少在没有使用CodeDom 之类的东西来实际编写和编译代码的情况下是这样)。

话虽如此,即使您可以做到这一点,也没有使用此类的好方法。匿名类型实际上是在定义它们的函数中使用的,它们被转换成一个完整的类,由编译器在编译时生成。

一种可能的选择是使用dynamic

dynamic anObject = new ExpandoObject();
anObject.name = "hello";
anObject.id = 654;

您也可以通过ExpandoObjectIDictionary<string,object>界面使用它:

dynamic anObject = new ExpandoObject();
var setObject = (IDictionary<string,object>)anObject;
setObject["name"] = "hello";
setObject["id"] = 654;

// These can be accessed directly now
Console.WriteLine(anObject.name);
Console.WriteLine(anObject.id);

但是,您仍然需要一种使用它的好方法——在不知道代码应该如何访问变量的情况下,动态构建类型无助于解决许多问题,只会创建更多问题......

于 2012-10-30T16:12:49.037 回答
0

不幸的是,您将不得不使用Reflection.Emit创建具有所有属性的新类型。匿名类型实际上是与任何其他类型没有区别的类,除了编译器自动创建它们的定义。

根据您的情况,dynamic ExpandoObject对象可能是您的答案。

于 2012-10-30T16:13:45.273 回答