2013-09-24 19 views
4

我有一些函數,其原型看起來有點像這樣: public void doThings(string sql, dynamic dParams);傳遞動力參數與ExpandoObject

它確實某種SQL與這些參數查詢。我沒有寫,但我必須使用它。

doThings("select * from SomeTable where [email protected] and [email protected]", 
     new 
     { 
      v1 = new Dapper.DbString() 
      { 
       Value = "yay", 
       IsAnsi = true, 
       Length = 50 
      }, 
      v2 = new Dapper.DbString() 
      { 
       Value = "really", 
       IsAnsi = true, 
       Length = 32 
      } 
     }); 

而不是當我第一次把動態PARAMS到ExpandoObject:

dynamic dynParams = new ExpandoObject(); 
dynParams.v1 = new Dapper.DbString() 
    { 
     Value = "yay", 
     IsAnsi = true, 
     Length = 50 
    } 
doThings("query here", dynParams); 

查詢然後返回任何結果,當我做這樣的事情,它工作正常。我不想叫doThings()和寫入new塊十倍十個不同的場景,我可能要查詢myval2myval3等。有沒有什麼特別的方式可以傳遞ExpandoObject,或者我應該這樣做的其他方式?

回答

0

看起來doThings使用反射來獲取需要的值,當你寫:

new { 
    v1 = 1, 
    v2 = "foo" 
} 

你與兩個屬性v1v2創建一個類型,但是當你使用 您ExpandoObjectExpandoObject添加任何新屬性(它的所有魔術行爲都是編譯器生成的東西)。

如果你想使用doThing的屬性已知在編譯時,我明白,沒有 問題。當在運行時知道屬性時,我可以考慮的唯一方法是在運行時使用Reflection.Emit生成所需的匿名類型。看看this的文章。

2

小巧玲瓏不支持expandos將默認,但你可以傳遞的expando到Dictionary<string,object>的構造函數,然後傳遞的動態參數。

0

作爲@邁克爾B已經提到的,小巧精緻的不支持expandos將作爲PARAMS。

如果您需要根據此article動態創建參數集 ,則可以使用DynamicParameters

因此,你可以建立一個翻譯從dynParamsDynamicParameters,它看起來是這樣的:

dynamic dynParams = new ExpandoObject(); 
dynParams.v1 = new Dapper.DbString() 
{ 
    Value = "yay", 
    IsAnsi = true, 
    Length = 50 
}; 

var parameters = new Dapper.DynamicParameters(); 

((ExpandoObject)dynParams).ToList().ForEach(kvp => parameters.Add(kvp.Key, kvp.Value)); 

它認爲它可能是一個不錯的功能。