我有一个MVC3 RouteValueDictionary,我想快速转换为匿名类型。
例如:
new RouteValueDictionary(){{"action","search"}}
与
相同new {action="search"}
答案 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) });