2013-04-02 23 views
13
böyle herhangi bir dış yöntemini çalıştırır bir sınıf, olmasını istediğiniz

: Bu mümkün müDelege - C#

class CrazyClass 
{ 
    //other stuff 

    public AnyReturnType Execute(AnyKindOfMethod Method, object[] ParametersForMethod) 
    { 
    //more stuff 
    return Method(ParametersForMethod) //or something like that 
    } 
} 

? Herhangi bir yöntem imzasını alan bir temsilci var mı?

+1

Nasıl buna ne parametreler geçmek bilecek? Parametre sayısı ve türü konusunda yanlış tahmin ederseniz ne olur? – Servy

cevap

26

Sen Func<T> ve kapanışları ile bu farklı bir yol yapabilirsiniz:

public T Execute<T>(Func<T> method) 
{ 
    // stuff 
    return method(); 
} 

Arayan sonra bunu uygulamak için kapanışları kullanabilirsiniz:

var result = yourClassInstance.Execute(() => SomeMethod(arg1, arg2, arg3)); 

Buradaki avantaj için derleyici sağlamasıdır Sizin için zorlu bir iş yapın ve yöntem çağrıları ve geri dönüş değeri her tür güvenlidir, intellisense sağlayın, vb.

+1

Bu kadar .... temiz. –

+0

Bunu CrazyClass'ın yapıcısında yapabilir miyiz? Öyleyse nasıl? – toddmo

+0

@toddmo - Bunu yapmak istiyorsanız CrazyClass jenerik yapmalısınız. –

0

Yansımalar kullanmanın daha iyi olduğunu düşünüyorum Bu durumda, alacak olarak söz konusu istedi tam olarak ne - (statik veya örneği) herhangi bir yöntem, herhangi bir parametre:

public object Execute(MethodInfo mi, object instance = null, object[] parameters = null) 
{ 
    return mi.Invoke(instance, parameters); 
} 

Bu System.Reflection.MethodInfo sınıfı.

3

Kinda bunu neden ilk etapta yapmak istediğinize bağlıdır ... Bunu Func jenerikini kullanarak yapardım, böylece CrazyClass hala parametrelerden habersiz olabilir.

class CrazyClass 
{ 
    //other stuff 

    public T Execute<T>(Func<T> Method) 
    { 
     //more stuff 
     return Method();//or something like that 
    } 


} 

class Program 
{ 
    public static int Foo(int a, int b) 
    { 
     return a + b; 
    } 
    static void Main(string[] args) 
    { 
     CrazyClass cc = new CrazyClass(); 
     int someargs1 = 20; 
     int someargs2 = 10; 
     Func<int> method = new Func<int>(()=>Foo(someargs1,someargs2)); 
     cc.Execute(method); 
     //which begs the question why the user wouldn't just do this: 
     Foo(someargs1, someargs2); 
    } 
} 
0
public static void AnyFuncExecutor(Action a) 
{ 
    try 
    { 
     a(); 
    } 
    catch (Exception exception) 
    { 
     throw; 
    } 
}