在Python *允許我傳遞一個列表,功能參數:C#,傳遞數組作爲函數參數
def add(a,b): return a+b
x = [1,2]
add(*x)
我可以複製在C#這種行爲與陣列?
謝謝。
在Python *允許我傳遞一個列表,功能參數:C#,傳遞數組作爲函數參數
def add(a,b): return a+b
x = [1,2]
add(*x)
我可以複製在C#這種行爲與陣列?
謝謝。
不測:
然後很不幸,不,你不能那樣做。
.NET中不支持基於關鍵字和基於位置的參數傳遞,就像在Python中一樣,除了通過反射之外。
請注意,爲什麼這不被支持可能有幾個很好的理由,但我想到的是「爲什麼你需要這樣做?」。通常情況下,只有在將該方法包裝到另一個圖層中時才使用此模式,而在.NET中,您已強制鍵入代表,因此通常只剩下基於反射的代碼,即便如此,您通常也會對方法被調用。所以我的直覺反應,即使我回答你的問題,是你不應該這樣做,並找到一個更好,更友善的方式來實現你想要的東西。
下面是一個例子使用反射:
using System;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
public Int32 Add(Int32 a, Int32 b) { return a + b; }
static void Main(string[] args)
{
Program obj = new Program();
MethodInfo m = obj.GetType().GetMethod("Add");
Int32 result = (Int32)m.Invoke(obj, new Object[] { 1, 2 });
}
}
}
的params關鍵字允許類似的東西
public int Add(params int[] numbers) {
int result = 0;
foreach (int i in numbers) {
result += i;
}
return result;
}
// to call:
int result = Add(1, 2, 3, 4);
// you can also use an array directly
int result = Add(new int[] { 1, 2, 3, 4});
你可以使用反射。然而,如果它總是可變長度,那麼使用數組作爲方法defenition可能會更好,但是,除非可以通過集合方法/數組方法處理基本需求,否則仍然需要解析列表。
我相當肯定你可以使用反射來訪問你的方法,然後使用Invoke,使用你的數組作爲參數列表。儘管如此,那種圓潤的感覺。
Upvoted這一個,而不是params解決方案,因爲它更正確地匹配問題。如果問題問如何轉換一個函數,如「def add(* numbers):」 – 2010-01-07 20:59:11
謝謝,params解決方案將是正確的。這與我所尋找的最接近,因爲我無法修改方法簽名。有時間閱讀C#和反思,但是,這聽起來像我應該重構我的方法。 – Mark 2010-01-07 20:59:15
只有當你不能改變簽名時,並且只有當你真的*必須*將值作爲數組傳遞時。無論如何,你爲什麼要這樣做? – 2010-01-07 21:02:32