将RouteValueDictionary转换为匿名对象的快速方法?

时间:2011-09-23 01:43:05

标签: .net asp.net-mvc-3

我有一个MVC3 RouteValueDictionary,我想快速转换为匿名类型。

例如:

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

相同
new {action="search"}

2 个答案:

答案 0 :(得分:6)

在运行时无法做到这一点。需要事先在编译时知道匿名类型的属性。

答案 1 :(得分: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) });