【问题标题】:Passing in member functions as delegate parameters将成员函数作为委托参数传入
【发布时间】:2018-06-26 14:06:01
【问题描述】:

我有一个基类,它的 ctor 接受一个委托作为参数和一个继承自它的类。

以下工作正常:

class Base
{
    public Base(Func<bool> func)
    {
    }
}

class Sub : Base
{
    public Sub()
        : base(() => true)
    {
    }

    public Sub(int i)
        : base(() => { return true; })
    {
    }
}

如何将实例函数作为参数传递? 编译器报错“非静态字段、方法或属性需要对象引用”。

我想要的是这样的:

class Sub : Base
{
    public Sub()
        : base(Func)
    {
    }

    private bool Func()
    {
        return true;
    }
}

如果Func 是静态方法,它会起作用。但我想在函数中使用实例成员。

我怎样才能做到这一点?

【问题讨论】:

  • 这在我看来像是一个 X Y 问题,你能把你的基类改成只调用一个虚拟方法然后重写它吗?
  • @Boo 这是我会赞成的答案...(提示提示!)
  • @Boo 这假定委托必须是一个实例方法,而不是简单地让它成为一个实例方法(或其他任何东西)。
  • @Boo 我想这会起作用。我非常专注于委托,以至于我完全忘记了虚拟甚至抽象方法。

标签: c# delegates


【解决方案1】:

正如评论的那样,这在我看来像是一个 X Y 问题,并且似乎是一个有缺陷的设计, 您可以将基类更改为仅调用虚拟方法并覆盖它吗?

class Base
{
    public Base()
    {
    }

   public virtual bool func() {return false};
}   

class Sub : Base
{
  public Sub()
  {
  }

  public override bool func()
  {
    return true;
  }
}

您也可以在https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/virtual阅读更多相关信息

【讨论】:

  • 是的,我认为这是要走的路。谢谢。
  • 如果您还希望能够从外部放入任意委托,您可以拥有像Func&lt;bool&gt; FuncProp 这样的属性,它要么存储给定的委托,要么如果没有给出则指的是@987654324 @ 方法。然后在需要的地方使用该属性。
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
相关资源
最近更新 更多