2015-11-02 77 views
0

如何將var傳遞給函數?如何將var傳遞給C#中的函數

我需要建立以下未知的數據模型,並將它傳遞給我的功能,它使用喊解析RazorRenderer它:

var emailData = new {name="value" , name2="value2" ... , nameN="valueN"} 

功能不能接收無功,所以我們使用的對象,但隨後我們不能把它轉換回來,我們得到一個異常時,調用:

string htmlBody = render.Parse(File.ReadAllText(TemplatePath), emailData); 

當我做到以下幾點,在相同功能的工作原理:

var emailData = new { UserRequest = "hello", UserEmail = "[email protected]" }; 
string htmlBody = render.Parse(File.ReadAllText(TemplatePath), emailData); 

但是,當嘗試將emailData傳遞給它不起作用的函數時,有什麼想法?

我可以將函數渲染出來,並將結果傳遞給函數,但我認爲在函數內部執行它可能會很好。

順便說一句,我試過JSON序列化和Decerialize,沒有運氣。

+0

相關:http://stackoverflow.com/q/33019305/993547。 –

+0

你有什麼理由需要它作爲匿名對象嗎?通常,當傳遞函數範圍外的對象時,最好創建一個具體類型。 –

+0

在第一個示例中調用'render.Parse'時會得到什麼異常? –

回答

0

如果我正確理解你的問題,這是不可能的。匿名類型名稱不能在用戶代碼中表示,因此無法將它們作爲函數的輸入參數。

最好的辦法是創建一個類型並將其用作查詢的返回值,然後將其傳遞給該函數。例如,

class YourDataClass { 
    public string ColumnName; 
} 

var query = (from name in some.Table 
      select new YourDataClass { ColumnName = name }); 
YourMethod(query); 

...

YourMethod(IEnumerable<YourData> enumerable); 

在這種情況下,雖然,你只能選擇一個字段,所以它可能是更容易只需直接選擇字段。這將導致查詢被鍵入爲字段類型的IEnumerable。

+0

「匿名類型名稱不能在用戶代碼中表示,因此無法將它們作爲函數的輸入參數。」 >這是錯誤的。它們可以被表示,意味着什麼,它們可以被傳遞。 –

+1

@PatrickHofman雖然我能理解這個答案中的措辭是錯誤的,但情緒是正確的。沒有辦法明確引用匿名類型。他們可以傳遞的唯一方法是1)作爲普通對象,因爲OP已經在做,或者2)在推斷泛型參數的泛型方法中。 (對於雙重通知,抱歉,編輯我早先的評論爲時已晚)。 – hvd