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(){

我对这种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(){
     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
    Action
    变体:随着C#已经演变成一种功能性更强的语言,程序员已经不再使用自定义委托类型,而是倾向于使用提供的
    Func
    Action
    变体。由于参数仍然是强类型的,因此您可以获得编译语言的大部分优势,但对于传递的实际函数,可以使用一些“duck类型”

    例如,可以根据您希望委托处理的类型为类指定泛型类型:

    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操作符。