C#语法,将委托分配给类,稍后调用
我对这种C#语法有点困惑。 我试图将任意委托分配给一个类 我的代理定义为C#语法,将委托分配给类,稍后调用,c#,delegates,C#,Delegates,我对这种C#语法有点困惑。 我试图将任意委托分配给一个类 我的代理定义为 delegate string stringCB(string s); delegate int intCB(int i); 我有课 class run_by_name { public string name {get;set;} public Delegate method {get;set;} }; 我正在尝试实例化它 run_by_name myfuc = new run_by_name(){
delegate string stringCB(string s);
delegate int intCB(int i);
我有课
class run_by_name {
public string name {get;set;}
public Delegate method {get;set;}
};
我正在尝试实例化它
run_by_name myfuc = new run_by_name(){
name = "my name",
method = new stringCB(string s) {
return " testing " + s;
};
};
当存在返回类型时,我真的不清楚如何分配给委托。另外,我不确定以后如何在语法上调用该方法
我为什么要这么做?我只是在写一些代码,遵循我在JS中经常使用的事件处理模式,我只是在做一个“对象”,我可以为一个创建而不是定义的通用事件处理程序分配任意函数。(重要)
此外,欢迎使用代理的替代方案。:)
编辑:以后如何使用它我还没有写出来,但我很肯定我会写的
List<run_by_name> callbacks = new List<run_by_name>();
/* lets say this is initialized and filled at this point */
public object FindAndRunCallback(string Name, object input) {
foreach(var cb in callbacks) {
if( cb.name == Name )
return cb.method(input);
}
return null;
}
List callbacks=newlist();
/*假设这是在这里初始化和填充的*/
公共对象FindRunCallback(字符串名称、对象输入){
foreach(回调中的var cb){
如果(cb.name==name)
返回cb.方法(输入);
}
返回null;
}
以下是使当前代码正常工作所需的语法:
method = new stringCB((string s) => {
return " testing " + s;
})
或者,使用lambda表达式:
method = new stringCB(s =>" testing " + s)
您可以稍后像这样调用该方法:
string result = (string) myfuc.method.DynamicInvoke("hello");
在不了解更多用例的情况下,很难推荐其他方法,但我建议至少研究以下内容:
- 事件:您的描述听起来非常接近C#中事件和事件处理程序的常见模式。事件定义用于处理它的委托类型,其他地方的代码可以使用与该委托类型匹配的方法订阅该事件。按照惯例,人们通常将发送者
作为第一个参数传递,而一些强类型的对象
则传递给订阅者,这样订阅者就不必猜测当事件触发时哪些数据可用事件参数
和Func
变体:随着C#已经演变成一种功能性更强的语言,程序员已经不再使用自定义委托类型,而是倾向于使用提供的Action
和Func
变体。由于参数仍然是强类型的,因此您可以获得编译语言的大部分优势,但对于传递的实际函数,可以使用一些“duck类型” 例如,可以根据您希望委托处理的类型为类指定泛型类型:Action
然后你可以简单地说:class run_by_name<T> { public string name {get;set;} public Func<T, T> method {get;set;} };
string result = myfuc.method("hello");
strinCB
构造函数需要一个接受字符串参数并返回字符串的方法。如果您有一个现有的方法,您可以将其名称传递给构造函数,或者您可以创建一个匿名方法,如下面的委托语法所示:
method = new stringCB(delegate(string s)
{
return " testing " + s;
})
Func<int, int, int> sum = (x, y) => x + y;
Console.WriteLine(sum(2,3)); // with the name of delegate
Console.WriteLine(sum.Invoke(2,3)); // or using Invoke method
或者使用lambda表达式:
method = new stringCB(s =>
{
return " testing " + s;
})
然后可以这样调用它:myfuc.method.DynamicInvoke(YourParameter)代码>
通常,调用委托的方法非常简单,如下所示:
method = new stringCB(delegate(string s)
{
return " testing " + s;
})
Func<int, int, int> sum = (x, y) => x + y;
Console.WriteLine(sum(2,3)); // with the name of delegate
Console.WriteLine(sum.Invoke(2,3)); // or using Invoke method
Func sum=(x,y)=>x+y;
Console.WriteLine(sum(2,3));//以代表的名义
Console.WriteLine(sum.Invoke(2,3));//或者使用Invoke方法
但是在这种情况下,您需要使用DynamicInvoke
,因为您的属性类型是Delegate
除此之外,.NET Framework
还有一些有用的内置委托类型,如、等。只要它们满足您的需要,您就可以使用它们而不是创建自己的委托。例如,在这种情况下,您可以使用Func
而不是stringCB
为什么不使用实际事件?签出Action
和Func
及其同级。您应该查看而不是method=new-stringCB(string s){return“testing”+s;}代码>您需要编写方法=(字符串s)=>(“测试”+s)代码>。如何使用操作,这是我最初的方法,但我遇到了同样的语法问题。旁注:如果从另一端开始,可能会更好-决定如何调用方法(使用可编译语法),而不是设计类。。。至少考虑一下你想用名字和参数来称呼他们。你也应该处理<代码>如何调用那个方法< < /Cord>问题】。这很好,明确地解决了我的困惑,也很好地知道如何使用lambda操作符。