2014-06-06 59 views
0

是否有可能在C#中的通用函數獲取作爲輸入一些類和方法(的類)和參數的方法(也許結果類型)並創建該類的實例並使用參數調用該類的函數並返回結果?C#使通用的方法知道如何調用「某些」類的功能

+0

你應該能夠反射 –

+0

做到這一點,你可以添加代碼,請... –

+0

看這裏:http://msdn.microsoft.com/library/system.type.getconstructor%28v=vs.110%29.aspx和http://msdn.microsoft.com/library/system.type.getconstructor%28v=vs .110%29.aspx –

回答

3

當然。

public class MyClass 
{ 
    public class Test 
    { 
     public int TestMethod(int a, int b) 
     { 
      return a + b; 
     } 
    } 

    public static void Main() 
    { 
     int result = ExecuteMethod<Test, int>("TestMethod", 1, 2); 
     Console.Read(); 
    } 

    public static TResult ExecuteMethod<TClass, TResult>(string methodName, params object[] parameters) 
    { 
     // Instantiate the class (requires a default parameterless constructor for the TClass type) 
     var instance = Activator.CreateInstance<TClass>(); 

     // Gets method to execute 
     var method = typeof(TClass).GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance); 

     // Executes and returns result 
     return (TResult)method.Invoke(instance, parameters); 
    } 
} 
+0

謝謝,這就是我搜索的! –

2

除非反思是你絕對的選項,使用下面的代表之一:

  • Action<T>:會讓你執行一個不返回值的方法。有幾個重載可以讓你傳入更多的參數。

  • Func<TResult>:是否允許您執行返回類型爲TResult的結果的方法。有更多的重載可以讓你傳入更多的參數。他們都遵循語法Func<T1, T2, T3, TResult>等。

  • 最後,你可以定義你自己的委託。

1

以下是如何使用反射創建類的實例,然後調用該類的方法。

假設你有一個類:

public class MyType 
{ 
    public void DoSomething() 
    { 
     // do stuff here 
    } 
} 

你可以做到以下幾點:

Type instanceType = Type.GetType("MyType"); 
object instance = Activator.CreateInstance(instanceType); 

MethodInfo method = instanceType.GetMethod("MethodName"); 
object returnValue = method.Invoke(instance, new object[] { /* paramaters go here */ }); 
相關問題