C# 如果委托是非静态的,如何将委托传递给方法?

C# 如果委托是非静态的,如何将委托传递给方法?,c#,delegates,instance,idisposable,using,C#,Delegates,Instance,Idisposable,Using,我刚刚开始理解委托,我有一个实现IDisposable的类: public class MyClass : IDisposable { public delegate int DoSomething(); public int Zero() {return 0;} public int One() {return 1;} public void Dispose() { // Cleanup } } 使用MyClass的方法(在另一个类中定义): public

我刚刚开始理解委托,我有一个实现IDisposable的类:

public class MyClass : IDisposable
{
  public delegate int DoSomething();

  public int Zero() {return 0;}
  public int One() {return 1;}

  public void Dispose()
  {
    // Cleanup
  }
}
使用MyClass的方法(在另一个类中定义):

public class AnotherCLass
{
    public static void UseMyClass(MyClass.DoSomething func)
    {
      using (var mc = new MyClass())
      {
        // Call the delegate function
        mc.func(); // <-------- this is what i should actually call
      }
    }
}

因为它是一个实例方法,如果你想调用它,你需要一个实例。这就是CLR的工作原理。但是,您可以选择两种方式:

  • 将成员函数设置为静态。如果它们只返回一个静态值那么简单,那么它们就没有理由成为实例方法。但是,如果您确实需要实例数据
  • 使用单例实例。这样,您就不需要每次调用静态方法时都创建一个新实例
你可以这样做:

public class MyClass
{
    private static MyClass singletonInstance;
    public static MyClass SingletonInstance
    {
        get
        {
            if (singletonInstance == null)
            {
                singletonInstance = new MyClass();
            }
            return singletonInstance;
        }
    }

    // the rest of your class implementation
}
public class MyClass : IDisposable
{
  public delegate int DoSomething();

  public int Zero() {return 0;}
  public int One() {return 1;}

  public void Dispose()
  {
    // Cleanup
  }
}

public class AnotherCLass
{
    public static void UseMyClass(Converter<MyClass,int> func)
    {
      using (var mc = new MyClass())
      {
        // Call the delegate function
        func(mc);
      }
    }
}

AnotherClass.UseMyClass(
    (Converter<MyClass, int>)Delegate.CreateDelegate(
        typeof(Converter<MyClass, int>),
        typeof(MyClass).GetMethod("One")
    )
);
然后,您可以这样调用静态方法:

AnotherClass.UseMyClass(MyClass.SingletonInstance.Zero);

没有实例化就无法完成。以下是你可以做到的:


public static void main(string[] args)
{
  // Call AnotherClass method, by passing Zero()
  // or One() but without instatiate MyCLass
  AnotherClass.UseMyClass((new MyClass()).Zero);
}

您是否希望实例由委托的调用方而不是委托的创建者提供?C#确实支持这样一个未绑定的委托,它被称为开放委托,实例成为一个参数

您必须使用创建一个开放委托,如下所示:

public class MyClass
{
    private static MyClass singletonInstance;
    public static MyClass SingletonInstance
    {
        get
        {
            if (singletonInstance == null)
            {
                singletonInstance = new MyClass();
            }
            return singletonInstance;
        }
    }

    // the rest of your class implementation
}
public class MyClass : IDisposable
{
  public delegate int DoSomething();

  public int Zero() {return 0;}
  public int One() {return 1;}

  public void Dispose()
  {
    // Cleanup
  }
}

public class AnotherCLass
{
    public static void UseMyClass(Converter<MyClass,int> func)
    {
      using (var mc = new MyClass())
      {
        // Call the delegate function
        func(mc);
      }
    }
}

AnotherClass.UseMyClass(
    (Converter<MyClass, int>)Delegate.CreateDelegate(
        typeof(Converter<MyClass, int>),
        typeof(MyClass).GetMethod("One")
    )
);

也许如果你能解释一下你想做什么,我们可以推荐一些更好的。MyClass是DAL,我有一些成员方法要调用。另一个类(业务)使用DAL并定义“UseMyClass”方法。如何从GUI中传递零()函数到业务类,而不创建MyClass的新实例?您可以考虑使用MyC类对象上的接口来公开零()属性,然后让您的UsMyCype函数以该接口作为参数。嗯,对我来说似乎是个更好的方法。不,我不会。我不喜欢等级制度的爆炸。。。看到我的编辑了吗?我搞糊涂了。如果函数
Zero()?如果您想在没有
MyClass
实例的情况下调用它,为什么不将其设置为
static
?不,应该是mc.func(),而不是像您编写的那样。Gremo:C#不支持按您的需要执行
mc.func()
func(mc)
语法正确。