2016-03-17 27 views
-1

我代表......選擇委託我的方法,而不反射

private delegate double CalculateDelegate(double x, double y); 

代碼declareing代表...

private CalculateDelegate calculate; 

我使用的方法與我的代理...

private double Add(double x, double y) { return x + y; } 
private double Subtract(double x, double y) { return x - y; } 

我如何執行所需的方法...

calculate = new CalculateDelegate(Add); 

或...

calculate = new CalculateDelegate(Subtract); 

這工作,但作爲實際的代碼包含了更多的「功能」我想避免使用開關/ IF語句。因此,所有我需要的是寫新的方法將其發送。

的計算方法(我usied的行動在這裏想它可能工作,它不)

public double calc(Action methodName, double x, double y) 
    { 
     calculate = new CalculateDelegate(methodName); 
return calculate(x,y); 

    } 

我多麼想執行所需方法。

public void go() 
{ 
    calc(Add, 5,4); 
} 

這可能沒有反思嗎?

+1

目前還不清楚你在問什麼。請詳細描述實際問題,並提供一個關於您的要求的真實而簡單的例子。 –

+0

根據您應該選擇所需方法的標準? – Lou

+0

你可以這樣做:'CalculateDelegate method = Add;' - 是不是你想要的?而'新的CalculateDelegate(X)' - X不僅僅是一個「方法名稱」,它是一種實際的方法,這就是所謂的「方法組轉換」。你必須提供一個實際的方法*,而不僅僅是一個名字。但不清楚爲什麼你不能簡單地使用我在本評論開始時給出的例子。 –

回答

3

這個solution,只需使用你的代表字典,鍵是代表相同的名字,看看例子:

public delegate double CalculateDelegate(double x, double y); 

public class Test 
{   
    public CalculateDelegate calculate;     
} 

public class DelegateContainer 
{ 
    public double Add(double x, double y) 
    { 
     return x + y; 
    } 
    public double Subtract(double x, double y) 
    { 
     return x - y; 
    } 

    public Dictionary<string, CalculateDelegate> collection = new Dictionary<string, CalculateDelegate>(); 
    public DelegateContainer() 
    { 
     collection["Add"] = Add; 
     collection["Subtract"] = Subtract; 
    } 

    public CalculateDelegate this[string name] 
    {    
     get 
     {     
      return collection[name]; 
     }    
    } 
} 

public static void Main() 
{   
    var target = new Test(); 
    var container = new DelegateContainer(); 
    target.calculate = container["Add"]; 
    Console.WriteLine("1 + 2 = " + target.calculate(1, 2)); 

    target.calculate = container["Subtract"]; 
    Console.WriteLine("5 - 2 = " + target.calculate(5, 2)); 
} 
+0

你不需要手動實例化委託,類型是自動推斷的;即簡單地'收集[「添加」] =添加;'會工作。 – Lou

+0

感謝@LousyCoder。 –

+0

這也是我猜測OP的需求。 –