C#委托能否包装类?类比C++ std::function的实现疑问
在C#中实现类似C++ std::function包装自定义类的效果
嘿,这个问题我之前也碰到过!C++的std::function对带operator()的自定义类(也就是functor)支持得特别顺畅,但C#的委托机制逻辑有点不一样,不过完全能实现你想要的效果,我给你拆解下:
首先得搞清楚报错的原因:你写new Foo(new Bar())的时候,编译器不知道该把Bar的哪个方法绑定到Foo委托上——C#的委托要求明确指定要绑定的方法,而不像C++的std::function会自动识别operator()。
下面是几种可行的解决方案:
1. 直接绑定到Bar的Invoke方法
这是最直接的方式,明确告诉委托要调用Bar实例的Invoke方法:
class Program { delegate void Foo(); class Bar { public void Invoke() { } } static void Main() { Bar barInstance = new Bar(); // 把Bar实例的Invoke方法绑定到委托 Foo fooDelegate = new Foo(barInstance.Invoke); fooDelegate(); // 调用委托,会执行barInstance.Invoke() } }
2. 使用内置委托+Lambda(更贴近C++的简洁感)
如果你不想自己定义委托类型,可以用C#内置的Action(对应无返回值、无参数的委托),配合Lambda表达式来包装,写法和C++的std::function更像:
using System; class Program { class Bar { public void Invoke() { } } static void Main() { // 直接用Lambda包装Bar的调用 Action myAction = () => new Bar().Invoke(); myAction(); // 如果需要复用同一个Bar实例,也可以这么写: Bar barInstance = new Bar(); Action reusableAction = barInstance.Invoke; // 编译器会自动推断绑定方法 reusableAction(); } }
3. 别尝试继承System.Delegate
你提到委托内部是继承自System.Delegate的,但这里要注意:自定义类不能直接继承System.Delegate——这个类是CLR专门用于实现委托机制的,用户自定义类型不允许继承它,所以这条路走不通。
总的来说,C#虽然没有C++那种自动识别operator()的特性,但通过明确绑定方法或者用Lambda包装,完全可以实现类似“把自定义类的行为包装成委托”的效果。
内容的提问来源于stack exchange,提问作者asynts
相关产品推荐
相关产品推荐

