C# 为不带反射的委托选择我的方法名称

C# 为不带反射的委托选择我的方法名称,c#,winforms,delegates,C#,Winforms,Delegates,我的代表 private delegate double CalculateDelegate(double x, double y); 代表申报代码 private CalculateDelegate calculate; 与我的代表一起使用的方法 private double Add(double x, double y) { return x + y; } private double Subtract(double x, double y) { return x - y; } 如何

我的代表

private delegate double CalculateDelegate(double x, double y);
代表申报代码

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);
或者

这是可行的,但由于实际代码包含更多的“函数”,我希望避免使用switch/IF语句。因此,我所需要的就是编写新方法并将其发送进来

calc方法(我在这里使用该操作,认为它可能有效,但实际上无效)

我希望如何执行所需的方法

 public void go()
{
   calc(Add, 5,4);
}
这在没有反射的情况下是可能的吗?

关于这一点,只需使用代理字典和与代理名称相等的键,看看示例:

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));
}
public委托双计算委托(双x,双y);
公开课考试
{        
公共计算公费计算;
}
公共类委托容器
{
公共双加(双x,双y)
{
返回x+y;
}
公共双减法(双x,双y)
{
返回x-y;
}
公共字典集合=新字典();
公共委派容器()
{
集合[“添加”]=添加;
集合[“减法”]=减法;
}
public CalculatedLegate此[字符串名称]
{            
收到
{                
返回集合[名称];
}            
}
}
公共静态void Main()
{        
var target=新测试();
var container=新的DelegateContainer();
target.calculate=容器[“添加”];
Console.WriteLine(“1+2=“+target.calculate(1,2));
target.calculate=容器[“减去”];
Console.WriteLine(“5-2=“+target.calculate(5,2));
}

不清楚您在问什么。请详细描述实际问题,并就您的需求给出一个真实而简单的示例。根据什么标准,您应该选择所需的方法?您只需执行以下操作:
CalculateLegate method=Add-这不是你想要的吗?新的CalculateLegate(X)
-X不仅仅是一个“方法名”,它是一个实际的方法,这就是所谓的“方法组转换”。您必须提供实际的方法,而不仅仅是名称。但不清楚为什么你不能简单地使用我在这篇评论开始时给出的例子,最重要的是“选择”。在一个项目中,有不止一种方式可以做出选择。像if和switch语句一样,这是最直接的方法。或者查找表,可以是
字典
。你必须自己选择一个。为什么投票被否决?你不需要手动实例化委托,类型是自动推断的;i、 e.简单地
collection[“Add”]=Add可以。谢谢@LousyCoder。这也是我猜OP需要的。谢谢,我要参加一个mo会议,但很快就会尝试。
 public void go()
{
   calc(Add, 5,4);
}
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));
}