如何在 C# 中从 Action<T> 委托调用非静态方法

Roh*_*ash 4 c# generics static delegates

由于我正在编写要执行的某些操作的通用概念,因此我需要在操作委托中调用一些非静态方法。另外,它们在我的代码中都不是静态的。但我仍然无法调用 Action 定义中的非静态方法。这是我的代码-

private Dictionary<string, Action<object>> m_dicUndoRedoAction = new Dictionary<string, Action<object>>();
m_dicUndoRedoAction.Add("DeleteClass", DeleteClassFromeNode );
Run Code Online (Sandbox Code Playgroud)

这是DeleteClass的定义

private Action<object> DeleteClassFromeNode =
  data =>
  {
    Tuple<itemType1, itemType2> items = data as Tuple<itemType1, itemType2>;
    if (items != null && items.Item2 != null)
    {
      DeleteClass(items.Item2); // This is my non static method in the same class.
    }
  };
Run Code Online (Sandbox Code Playgroud)

这是我如何称呼代表

private void Undo_Executed(object sender, ExecutedRoutedEventArgs e)
{
  object temp;
  if (UndoRedoAction.DoUndo(out temp))
  {
    m_dicUndoRedoAction["DeleteClass"].Invoke(temp);
  }
}
Run Code Online (Sandbox Code Playgroud)

正如编译器所说

字段初始值设定项无法引用非静态字段、方法或属性“DeleteClassFromeNode”

我还查看了MSDN关于Action文章的参考,但是MS没有提到Action是否是隐式静态的,或者我是否走错了路?我还查找了静态方法的一些非静态调用,但没有一个得到令人满意的解释。如果有人提供低级解释,我将不胜感激。

关于回应彼得的解释

尽管初始化程序在构造函数完成之前运行,但这并不意味着它会在构造函数执行之间触发委托。即使您在 ILDASM 中查找其汇编代码,它也会将实际操作字段显示为非静态,但将缓存的匿名委托对象显示为静态。为什么编译器会有这种不同的行为?

在此输入图像描述

Pet*_*iho 6

正如编译器告诉您的那样,禁止您在初始化程序中使用非静态成员。这是因为初始化程序在构造函数完成之前运行,因此使用非静态成员不一定安全。

相反,只需在构造函数中执行初始化:

public MyClass()
{
    DeleteClassFromeNode = data =>
    {
        Tuple<itemType1, itemType2> items = data as Tuple<itemType1, itemType2>;
        if (items != null && items.Item2 != null)
        {
          DeleteClass(items.Item2); // This is my non static method in the same class.
        }
    };

    // Other initialization code can go here (or before...whatever is most appropriate)
}
Run Code Online (Sandbox Code Playgroud)