我有一個MVC3 RouteValueDictionary,我想快速轉換爲匿名類型。將RouteValueDictionary轉換爲匿名對象的快速方法?
例如:
new RouteValueDictionary(){{"action","search"}}
將是相同
new {action="search"}
我有一個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) });
爲什麼不應該在生產中使用?我試圖添加代碼並運行它進行調試並查看它做了什麼,但是LINQ語句不能編譯,我不知道如何解決它。 – ChadD
爲什麼你需要這樣做? –
@Darin:使用Ajax.ActionLink,並希望沿着存儲的路由對象傳遞它。最後報廢嘗試做我在OP中所要求的內容,然後通過正確的重載來處理它,然後傳遞一個RouteValueDictionary。因爲我仍然對可能的解決方案感到好奇 –