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));
}