【问题标题】:Could C# delegate point to another class/object's method?C#委托可以指向另一个类/对象的方法吗?
【发布时间】:2020-06-22 08:55:47
【问题描述】:

在这里,我希望获得一个类似于函数指针的委托,以指向另一个类(名为 Inner)中的类方法,然后将其传递给静态函数,如下所示:

public class Inner
{
    public int M = 3;
    public void F() { Console.WriteLine("f"); }
    public void G() { Console.WriteLine("g"); }
}
class Program
{
    public static void Caller(Action a)
    {
        a();
    }
    static void Main(string[] args)
    {
        var i = new Inner();
        var f = i.F;
        var g = i.G;
        f();//error
        g();//error
        Program.Caller(f);
        Console.WriteLine("Hello World!");
    }
}

我来自 c/c++,在 c/c++ 中,这样的函数指针非常简单,但是这个 C# 代码无法编译。我用谷歌搜索,发现几乎所有的委托解释都在谈论委托,它指向内部的类方法。

我的问题是,如何修复代码以使其正常工作?

【问题讨论】:

  • 到目前为止的答案都可以,但要在更大的上下文中使用,您可能需要阅读依赖注入Unity 是 .Net 中最常用的框架之一。

标签: c# function class methods delegates


【解决方案1】:

Coding Seb's answerhighlight 是问题的原因,但并没有真正解释原因。

这是因为i.F 是一个方法组,而不是一个特定的方法指针。例如,假设Inner 是这样定义的:

public class Inner
{
    public void F() { Console.WriteLine("f"); }
    public void F(string name) { Console.WriteLine(name); }
}

i.F 指的是哪种方法? F()F(string)?

因此,您需要显式定义变量类型,或强制转换指针:

Action f = i.F;

或者:

var f = (Action)i.F;

【讨论】:

    【解决方案2】:

    您不能在 C# 中的隐式变量中设置方法组,因此如果您只更改 Action 中的 2 个 var 它就可以工作

    public class Inner
    {
        public int M = 3;
        public void F() { Console.WriteLine("f"); }
        public void G() { Console.WriteLine("g"); }
    }
    class Program
    {
        public static void Caller(Action a)
        {
            a();
        }
        static void Main(string[] args)
        {
            var i = new Inner();
            Action f = i.F;
            Action g = i.G;
            f();
            g();
            Program.Caller(f);
            Console.WriteLine("Hello World!");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      相关资源
      最近更新 更多