我想创建一个包含委托的静态数组。我将使用此数组来查找我需要的委托。例如:
class HandlerID
{
public int ID { get; set; }
public Func<int, bool> Handler { get; set; }
}
protected const HandlerID[] HandlerIDs = {
new SectionRenderer() { ID = SectionTypes.Type1, Handler = MyType1Handler },
new SectionRenderer() { ID = SectionTypes.Type2, Handler = MyType2Handler },
// Etc.
}
protected bool MyType1Handler(int arg)
{
return false;
}
// Etc.
但是,Handler
数组中HandlerID
的分配会出现以下错误:
非静态字段,方法或属性'MyType1Handler(int)'
需要对象引用
我更喜欢数组是const
,所以不必为我的每个实例初始化它。有没有办法在静态数组中存储实例方法?
答案 0 :(得分:5)
这没有意义。
当您调用数组中的委托时,他们需要您的类的实例来操作。
因此,每个类实例都需要一组单独的委托。
如果方法实际上不需要操作实例,则可以使它们static
,这将解决问题。
或者,您可以将实例作为委托的参数,并使用调用方法的lambda表达式:Handler = (instance, arg) => instance.MyType1Handler(arg)
答案 1 :(得分:1)
你不能在C#中声明一个const
数组,试试readonly
确保指向数组的指针(实例)不会改变,但据我所知,没有办法以声明方式阻止要素被改变。
答案 2 :(得分:1)
您无法创建静态函数的委托,也无法在不存在的对象实例中创建函数的委托。但是,您可以存储MethodInfo,稍后在实例上调用它。
// Use MethodInfo instead of Func in HandlerId
public MethodInfo Method { get; set; }
// Create the static list of handlers
protected static HandlerID[] HandlerIDs = {
new SectionRenderer() { ID = SectionTypes.Type1, Method = typeof(MyHandlersClass).GetMethod("MyType1Handler") },
new SectionRenderer() { ID = SectionTypes.Type2, Method = typeof(MyHandlersClass).GetMethod("MyType2Handler") },
// Etc.
}
// invoke at some point
HandlersIds[0].Method.Invoke(aninstanceobject, new object[] { arg } );