静态委托数组中的实例方法
本文关键字:实例方法 数组 静态 | 更新日期: 2023-09-27 17:57:38
我有一个大的静态委托数组,该数组对该类的所有实例都是相同的。我想在数组中放置对实例方法的引用,即打开实例委托。编译器给了我一个错误。我该怎么做?
示例代码:
public class Interpreter
{
// >7 instance fields that almost all methods need.
private static readonly Handler[] Handlers = new Handler[]
{
HandleNop, // Error: No overload for `HandleNop` matches delegate 'Handler'
HandleBreak,
HandleLdArg0,
// ... 252 more
};
private delegate void Handler(Interpreter @this, object instruction);
protected virtual void HandleNop(object instruction)
{
// Handle the instruction and produce a result.
// Uses the 7 instance fields.
}
protected virtual void HandleBreak(object instruction) {}
protected virtual void HandleLdArg0(object instruction) {}
// ... 252 more
}
我考虑过的一些想法是:提供所有实例字段作为参数,但这很快就会变得很难处理。初始化每个实例的处理程序列表,但这会非常影响性能(我需要很多此类的实例)。
根据Jon Skeet对另一个问题的回答,以下内容将起作用:
public class Interpreter
{
private static readonly Handler[] Handlers = new Handler[]
{
(@this, i) => @this.HandleNop(i),
(@this, i) => @this.HandleBreak(i),
(@this, i) => @this.HandleLdArg0(i),
// ... 252 more
};
private delegate void Handler(Interpreter @this, object instruction);
protected virtual void HandleNop(object instruction) {}
protected virtual void HandleBreak(object instruction) {}
protected virtual void HandleLdArg0(object instruction) {}
}
C#中的直接支持会更好。也许还有另一种方法可以做到这一点,而不涉及间接和额外的类型?