将RouteValueDictionary转换为匿名对象的快速方法?
问题描述:
我有一个MVC3 RouteValueDictionary,我想快速转换为匿名类型。将RouteValueDictionary转换为匿名对象的快速方法?
例如:
new RouteValueDictionary(){{"action","search"}}
将是相同
new {action="search"}
答
这是不可能在运行时做的。在编译时,需要事先知道匿名类型的属性。
答
注意这个答案是由我认为这很有趣的事实说明的,然而这可能(绝对)不应该用于生产代码。
如果你能够构建一个匿名类型(模板)具有所有字典键你有兴趣,那么你可以使用下面的方法:
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
为什么你需要这样做? –
@Darin:使用Ajax.ActionLink,并希望沿着存储的路由对象传递它。最后报废尝试做我在OP中所要求的内容,然后通过正确的重载来处理它,然后传递一个RouteValueDictionary。因为我仍然对可能的解决方案感到好奇 –