2012-04-30 26 views
2

是否有任何可能性來實現一個方法,該方法將方法名稱和方法調用的參數集作爲參數來執行該方法並返回從方法執行中獲得的返回值?使用任何簽名執行方法的方法

該方法應該用於調用具有任何數量和類型參數的方法以及任何返回類型。

我知道這可以使用反射,但我有興趣,如果存在一個不同的方法,這將有一個比使用反射的性能更小的影響。

後來編輯: 我需要實現這樣的方法,因爲我有不同的方法簽名許多不同的方法的類,但一夥的大部分是相同的格式:

{  
    //code block 1 
} 
using (SomeObject obj = InitializeObject(){ 
    ... 
    //some operations 
    ... 
} 
{ 
    //code block 2 
} 

分別是密碼塊1密碼塊2是相同的,只有使用塊的部分是不同的。 我想只使用一種方法來包含常見的代碼塊,並針對不同方法的不同方法調用不同的方法。 我嘗試了使用反射,但它以可見的方式減慢了應用程序,所以我不會使用它。

+2

反思*爲*做的事情時,你只知道這個方法的名稱...你嘗試這樣做,發現它是太慢的方式? –

+0

@Jon Skeet - 是的,我嘗試了使用反射,但它顯着減慢了我的應用程序。 –

+0

您應該提供一些關於應用性質的更多數據,具體取決於您可以使用哪些數據,例如,泛型,表達式等,或充分設計系統。鑑於你的問題太籠統了,唯一的可能性就是JonSkeet所說的反思 – NSGaga

回答

1

對不起,但如果你得到的方法名稱爲字符串 - > .net反射是要走的路。

+0

我不止有方法名,應該執行的方法也在我的代碼中。我試圖用一種單一的方法來保持大量方法的共同行爲,這種方法會調用不同的部分,這些部分將會用更小的方法來實現。 –

1

沒有時間研究細節,但是將System.Reflection與Delegate.DynamicInvoke結合使用可能會讓你處於某個地方。

1

您可以在.NET 4.0中

利用最新的DLR能力看一看impromptuinterface項目及其後期綁定功能。

具體爲InvokeMemberInvokeMemberAction方法。這些比反射速度快2到4倍。

+0

感謝您的建議,但我想在.NET Framework –

+0

中使用「嵌入」的東西,在這種情況下,您必須堅持反思或自己實現即興功能子集。 –

1

像這樣的東西應該工作...

public static string ExecMethodByName 
    (string typeName, string methodName, string stringParam) 
{ 
    Type t = Type.GetType(typeName); 

    String s = (String)t.InvokeMember(
        methodName, 
        BindingFlags.InvokeMethod | BindingFlags.Public | 
         BindingFlags.Static, 
        null, 
        null, 
        new Object[] { stringParam }); 

    return s; 
}