2011-08-18 20 views
3

我有以下方法:如何測試如果在PARAMS涉及存在有效的方法

public MethodInfo FancyGetMethodInfo 
     (object obj, string methodName, Type[] methodSignature) 
    { 
     return obj.GetType().GetMethod(methodName, methodSignature); 
    } 

和一個例子的緣故,我有我的目標,我通過這兩種方法

public int Subtract(int a, int b) { return a - b; } 

    public int Add(params int[] a) { return a.Sum(); } 

當我執行下面的線,我得到這些結果:

 var SubMethod = FancyGetMethodInfo(obj, "Subtract", 
         new Type[] { typeof(int), typeof(int) }); 
     //I get a MethodInfo 
     var AddMethod = FancyGetMethodInfo(obj, "Add", 
         new Type[] { typeof(int), typeof(int) }); 
     //I get a Null reference 

我敢肯定,這是因爲在廣告中則params的d。有沒有一種乾淨的方式來獲取我的MethodInfo的引用給我的Add方法給定一個任意大小的Type []包含ints,並且只能訪問我的FancyGetMethodInfo方法中提供的變量?

編輯: 由Jon Skeet雄辯地說,我想執行與C#編譯器在我的方法中所做的相同的綁定。它需要與子類,隱式鑄造,任意長度params,等等正常工作...

也按要求,這裏的相關鏈接是:Determining if a parameter uses "params" using reflection in C#?這將讓我儘可能知道該方法有一個參數。

+0

我的手上沒有VS,但是你嘗試過typeof(int [])嗎? – Tigran

回答

1

嗯,你可以:

  • 查找所有正確名稱的方法
  • 對於每一種方法:
    • 檢查的方法中的最後一個參數是否爲「PARAMS」陣列(如每this question;感謝yas4891)
    • 檢查是否參數類型,你已經給直到但不包括最後一個參數匹配的人的方法
    • 檢查剩餘參數類型是否都匹配的數組元素類型最後一個參數

注意,一旦你找到了一個匹配(而不是發現匹配,並不需要此PARAMS擴展)你則需要,以便您可以稍後適當地處理參數(假設您想實際調用該方法)。

說實話,這有點兒不合理......我看到它的方式,你有三種選擇:

  • 更改主叫方在typeof(int[])通過與您現有的代碼將工作
  • 變化FancyGetMethodInfo處理參數排列上述
  • 變化Sum描述接受兩個整數(或者可能具有各種重載)

這取決於你選擇哪條路徑...

+1

如何找到「params」關鍵字已在這裏處理: http://stackoverflow.com/questions/627656/determining-if-a-parameter-uses-params-using-reflection-in-c 如果你喜歡將其包含在你的答案中 – yas4891

0

你給這一個嘗試:

從MSDN:Type.GetMethod

public void MethodA(int[] i) { } 

// Get MethodA(int[] i) 
mInfo = typeof(Program).GetMethod("MethodA", 
    BindingFlags.Public | BindingFlags.Instance, 
    null, 
    new Type[] { typeof(int[]) }, 
    null); 
Console.WriteLine("Found method: {0}", mInfo); 

如何檢查了 「PARAMS」 的文章:這已經回答了here

+0

問題在於OP希望能夠傳遞'new Type [] {typeof(int),typeof(int)}'並執行與C#編譯器相同的綁定。 –

+0

啊。你的意思是,如果你傳遞了'new Type [] {typeof(int),typeof(short)}'',它仍然可以工作。然後我得到了所有錯誤的問題 – yas4891

+0

@Jon:他沒有在任何地方提及。看起來他似乎只想知道如何綁定到「添加」方法。他甚至提到他正在尋找只有「int」參數的情況。 –

0

這是沒有因爲這些參數(儘管這可能會造成額外的問題)。

嘗試改爲: var AddMethod = FancyGetMethodInfo(obj,「Add」, new Type [] {typeof(int [])});

0

A params參數無非是一個普通數組的語法糖。

int Add(params int[] a) 

等同形式的CLR透視到

int Add(int[] a) 

PARAMS改性劑是簡單地C#語法糖。

這意味着如果你想使用反射,你將需要以下打電話找你的方法:

var AddMethod = FancyGetMethodInfo(obj, "Add", 
         new Type[] { typeof(int[]) }); 

如果進一步婉測試方法是否包含你需要測試它是否具有一個PARAMS參數ParamArrayAttribute應用於該方法的最後一個參數。

相關問題