2012-10-01 56 views
3

有沒有辦法發送任何方法作爲參數?我需要爲所有類型的方法做到這一點,而不是關心簽名和返回。說是這樣的(糟糕的代碼,只是想法):發送任何方法作爲獲取元數據的參數

public class Foo 
{ 
... 
void TestMethod(DontKnowWhatToPutHere theDelegate) {} 
... 
} 

... 

foo.TestMethod(-foo.AnotherMethod(1,2)-); 
foo.TestMethod(-foo.AnotherMethod("I don't care method signature nor returning type")-); 

我嘗試沒有成功與Action作爲參數來做到這一點。

我需要做什麼是送任何方法的功能,然後使用反射來獲取方法的名稱和參數,所以如果有你們能想出另一種方式,我會很高興聽到關於它也是如此。

+0

使用'string'。如果你要檢查這個班級,那麼通過知道某些想要的名字的方法存在,你就沒有很多東西可以獲得。 – millimoose

+0

嘿請看看這裏http://stackoverflow.com/questions/380198/how-to-pass-a-function-as-a-parameter-in-c它是一個確切的複製品,你問我猜 –

回答

9

不需要。編譯器總是必須能夠識別要轉換的特定委託,並且沒有與所有方法簽名兼容的單個委託類型。通過使用Action,Action<T>,Action<T1, T2>等,然後Func<TResult>,Func<T1, TResult>等等,你可以得到很長的路要走,但即使是outref參數也會失敗。此外,還有重載解決方案需要考慮。

此外,您的語法傳遞方法調用的結果,這與首先傳遞方法不同。 (這是忽略了-前綴/後綴,這似乎是捏造的語法。)

什麼你可能用途是Expression<Action>和包裝方法調用:

void TestMethod(Expression<Action> action) 
{ 
    ... 
} 

然後:

foo.TestMethod(() => foo.AnotherMethod(1,2)); 

TestMethod之內,您可以查看錶達式樹來發現它是一個方法調用,找出目標,參數等。有關更多信息,請參見MSDN page on expression trees。形成。

+0

+1尼斯詳細解釋 –

+0

+1。特別是對於許多單元測試框架中使用的'Expression'模式。 –

+0

太棒了!這很好。現在我得到了'((MethodCallExpression)action.Body).Method.Name'和'((MethodCallExpression)action.Body).Method.GetParameters()',除了AnotherMethod參數值之外,它給了我所需要的。我研究並發現,我無法使用反射來獲取參數值,有沒有任何解決方法才能獲得這個/這些參數? (除了發送'object []參數'作爲'TestMethod'參數) –

4

您可以通過MethodInfo對象

void TestMethod(MethodInfo methodInfo, object methodObject, object[] parameters) 
{ 
    methodInfo.Invoke(methodObject, parameters); 
} 
+0

'MethodInfo'是指方法還是方法組? – millimoose

+1

實際的方法(如果你指的是覆蓋/重載)。他們知道他們被聲明的類型,以及涉及的參數/類型。 –

+0

@ChrisSinclair那會讓這個答案無用。 – millimoose

0
public class Foo 
{ 
    void TestMethod(Action<int, int> theDelegate) {} 
    void TestMethod(Action<string> theDelegate) {} 
} 

foo.TestMethod(() => foo.AnotherMethod(1,2)); 
foo.TestMethod(() => foo.AnotherMethod("I don't care method signature nor returning type")); 
+0

任何方法,我不關心方法簽名和返回類型。這個解決方案將使我爲每種可能的方法編寫一個TestMethod覆蓋。 –

+0

這裏需要重載,但是你可以有一個GenericTestMethod在其中執行通用任務,並由每個重載方法調用。這樣你就沒有複製你的TestMethod邏輯。 –

相關問題