2012-12-21 79 views
1

我有这个反序列化XML的应用程序:动态生成匿名类型

<SpecialRoutesList> 
    <SpecialRoutes> 
     <SpecialRoute> 
      <Name>TestRoute1</Name> 
      <Pattern>TestRouteUrl1</Pattern> 
      <Defaults> 
       <Controller>Home</Controller> 
       <Action>TestRoute1</Action> 
       <Params> 
        <Key>id</Key> 
        <Value>1</Value> 
       </Params> 
      </Defaults> 
     </SpecialRoute> 
     <SpecialRoute> 
      <Name>TestRoute2</Name> 
      <Pattern>TestRouteUrl2</Pattern> 
      <Defaults> 
       <Controller>Home</Controller> 
       <Action>TestRoute2</Action> 
       <Params> 
        <Key>id</Key> 
        <Value>1</Value> 
       </Params> 
      </Defaults> 
     </SpecialRoute> 
    </SpecialRoutes> 
</SpecialRoutesList> 

我很想利用这个反序列化的信息来映射每个路线:

foreach(SpecialRoute route in SpecialRoutesList.SpecialRoutes) { 
    routes.MapRoute(route.Name, route.Pattern, new { ?????????? }, ????????); 
} 

要设置的默认值路由它需要使用匿名类型,那么如何使用这些匿名类型,在运行时从反序列化的类中获取键和值?

感谢

问候

何塞

+0

“匿名类型”的概念违约真的只有在编译时。在编译时你的代码根本不知道“类型”,但会生成一个非匿名类型,因此在运行时会有一个具体的类型在使用。有解析器将解析XML并生成动态类型。例如:http://baijumax.blogspot.ca/2012/02/deserializing-xml-to-dynamic-object-in.html –

回答

1

routes.MapRoute()建立从默认RouteValueDictionary。所以你可以从你的xml反序列化/构建Dictionary<string,object>并将它传递给routes.MapRoute()。与约束参数相同。

更新:建成字典

var defaults = new Dictionary<string, object> {{"controller", "Account"}, {"action", "Login"}}; 

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}", // URL with parameters 
    defaults 
); 
+0

嗨迪玛, 首先感谢您的答复。我尝试使用route.Defaults.ToDictionary(d => d.Key,d => d.Value)为了有一个字典<字符串,对象>,但看起来像不同于新的RouteValueDictionary(新{控制器= “X”,Action =“Y”}) – Jose3d

+0

我已经仔细检查了这一点,它的工作原理。我把我的代码放在updade中。你的代码不起作用的原因可能是URL模式参数和默认值不匹配。 – Dima