2011-09-23 100 views
4

我有一个MVC3 RouteValueDictionary,我想快速转换为匿名类型。将RouteValueDictionary转换为匿名对象的快速方法?

例如:

new RouteValueDictionary(){{"action","search"}} 

将是相同

new {action="search"} 
+1

为什么你需要这样做? –

+0

@Darin:使用Ajax.ActionLink,并希望沿着存储的路由对象传递它。最后报废尝试做我在OP中所要求的内容,然后通过正确的重载来处理它,然后传递一个RouteValueDictionary。因为我仍然对可能的解决方案感到好奇 –

回答

5

这是不可能在运行时做的。在编译时,需要事先知道匿名类型的属性。

1

注意这个答案是由我认为这很有趣的事实说明的,然而这可能(绝对)不应该用于生产代码。

如果你能够构建一个匿名类型(模板)具有所有字典键你有兴趣,那么你可以使用下面的方法:

public static class RouteValueDictionaryExtensions 
{ 
    public static TTemplate ToAnonymousType<TTemplate>(this RouteValueDictionary dictionary, TTemplate prototype) 
    { 
    var constructor = typeof(TTemplate).GetConstructors().Single(); 

    var args = from parameter in constructor.GetParameters() 
     let val = dictionary.GetValueOrDefault(parameter.Name) 
     select val != null && parameter.ParameterType.IsAssignableFrom(val.GetType()) ? (object) val : null; 

    return (T) constructor.Invoke(args.ToArray()); 
    } 
} 

哪个然后将可用像这样:

var dictionary = new RouteValueDictionary {{"action", "search"}}; 
var anonymous = dictionary.ToAnonymousType(new { action = default(string) }); 
+0

为什么不应该在生产中使用?我试图添加代码并运行它进行调试并查看它做了什么,但是LINQ语句不能编译,我不知道如何解决它。 – ChadD