2011-09-23 29 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

相關問題