2010-01-07 52 views

回答

9

不測:

  1. 改變方法簽名接受陣列
  2. 添加接受陣列的過載,提取值和呼叫原始過載
  3. 使用反射調用方法

然後很不幸,不,你不能那樣做。

.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 }); 
     } 
    } 
} 
+0

Upvoted這一個,而不是params解決方案,因爲它更正確地匹配問題。如果問題問如何轉換一個函數,如「def add(* numbers):」 – 2010-01-07 20:59:11

+0

謝謝,params解決方案將是正確的。這與我所尋找的最接近,因爲我無法修改方法簽名。有時間閱讀C#和反思,但是,這聽起來像我應該重構我的方法。 – Mark 2010-01-07 20:59:15

+0

只有當你不能改變簽名時,並且只有當你真的*必須*將值作爲數組傳遞時。無論如何,你爲什麼要這樣做? – 2010-01-07 21:02:32

12

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}); 
2

你可以使用反射。然而,如果它總是可變長度,那麼使用數組作爲方法defenition可能會更好,但是,除非可以通過集合方法/數組方法處理基本需求,否則仍然需要解析列表。

1

我相當肯定你可以使用反射來訪問你的方法,然後使用Invoke,使用你的數組作爲參數列表。儘管如此,那種圓潤的感覺。