gpt4 book ai didi

c# - 如何将委托(delegate)传递给委托(delegate)是非静态的方法?

转载 作者:行者123 更新时间:2023-11-30 22:42:36 24 4
gpt4 key购买 nike

我刚刚开始了解委托(delegate),我有一个实现 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
}
}
}

实际的问题:如何将 Zero() 函数传递给 UseMyClass 方法?我是否必须创建 MyClass 的实例(我想避免这种情况...)?

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

最佳答案

您的意图是该实例由委托(delegate)的调用者提供,而不是委托(delegate)的创建者吗? C# 确实支持这样的未绑定(bind)委托(delegate),它称为开放委托(delegate),实例成为参数。

你必须使用 Delegate.CreateDelegate创建一个开放的委托(delegate),像这样:

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( mc => mc.One() ); // C# 3 or later
AnotherClass.UseMyClass( delegate(MyClass mc) { return mc.One(); } ); // C# 2

关于c# - 如何将委托(delegate)传递给委托(delegate)是非静态的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4357480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com