2011-05-24 86 views
4

我試圖從一個Linq.Expression樹調用的String.Format。這裏有一個簡單的例子:調用(params對象[])[]

var format = Expression.Constant("({0}) {1}"); 
    var company = Expression.Property(input, membernames.First()); 
    var project = Expression.Property(input, membernames.Last()); 
    var args = new Expression[] {format, company, project}; 
    var invoke = Expression.Call(method,args); 

問題不過是擁有的String.Format的簽名:

String.Format(string format, params object[] args) 

,我試圖表達[]通過。

現在我可以繼續通過創建一個數組,用我的表達式的結果填充它的所有的麻煩,但我真正想要的結果是,是這樣的:

String.Format("({0}) {1}", input.foo, input.bar) 

怎麼辦我通過Linq表達式調用一個params函數?

回答

7

什麼params實際上做的是隻是該參數指定ParamArrayAttribute。 C#編譯器理解這一點,並在幕後創建數組。如果你想調用的方法與params

表達式不明白這一點,所以你確實有自己創建陣列。

Expression<Func<string>> expression =() => string.Format("",1,2,3,4); 
string expressionString = expression.ToString(); 

這裏,expressionString將包含此字符串:

() => Format("", new [] {Convert(1), Convert(2), Convert(3), Convert(4)}) 
這可以通過,當你使用分配 params - 方法來表達拉姆達表達式包含數組創建的事實也看到了

要創建創建陣列的表達,使用Expression.NewArrayInit() method

話雖這麼說,如果你只想要兩個參數(或一個或三個),有an overload of string.Format(),你可以從表達式直接使用。

0

params只是語法糖。最終,參數只是一個數組。因此,參數類型應爲object[],並且描述這樣一個數組的表達式就是您應該傳遞的第二個參數。換句話說,您應該只有參數,不。第二個參數應該是一個包含當前第二個和第三個參數的雙元素數組。