【问题标题】:Syntax of assigning a delegate variable in C# [duplicate]在 C# 中分配委托变量的语法 [重复]
【发布时间】:2015-03-24 06:48:14
【问题描述】:

我在这里查看了多个关于委托的问题,我认为我的语法正确,但 Visual 2012 抛出错误:myMethod 在当前上下文中不存在。

class Class1
{
    public delegate void DoSomething(List<dynamic> input);

    List<dynamic> myData = new List<dynamic>();
    Delegate myMethod;

    public void AssignData(List<dynamic> input)
    {
        myData.Clear();
        myData.AddRange(input);
    }

    public void AssignFunction(DoSomething method)
    {
        myMethod = method;
    }

    public void CheckDel()
    {
        myMethod(myData);
    }
}

}

这是似乎可以正常工作的调用代码:

private void Form1_Load(object sender, EventArgs e)
    {
        List<dynamic> test = new List<dynamic>();
        test.Add(1);
        test.Add(2);
        test.Add(3);

        myClass.AssignData(test);
        myClass.AssignFunction(callBack);
        myClass.CheckDel();
    }
    public void callBack(List<dynamic> input)
    {

        MessageBox.Show(input[0].ToString());
    }

一切似乎都很好,除了 CheckDel 函数返回上述错误。我希望能够随时使用 AssignFunction 分配方法。然后 Class1 可以使用 CheckDel 方法调用该方法。

【问题讨论】:

  • 为什么是Delegate myMethod; 而不是DoSomething myMethod;

标签: c#


【解决方案1】:

当您的委托被声明为一个普通的 Delegate 对象时,您必须通过调用 DynamicInvoke 方法来调用它。

myMethod.DynamicInvoke(myData);

出于性能原因,最好将您的委托声明为您想要的特定类型。即不是Delegate myMethod;,你知道它是DoSomething,所以使用DoSomething myMethod;

把它想象成声明的类比

object myObject;Class1 myObject; - 您需要将第一个转换为 Class1 以便在其上调用任何 Class1 方法。

确实,您可以将myMethod 转换为DoSomething,它会按预期工作:
((DoSomething)myMethod)(myData);

【讨论】:

  • 非常感谢。 (还有卡梅伦)。我从 vanilla C 迁移到 C# 并且仍然习惯于对象。你的解释很有道理。
  • 当然。此外,您应该研究泛型而不是动态。它会给你强大的类型,同时仍然让你重用你的代码。它类似于 C++ 模板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 2011-09-24
相关资源
最近更新 更多