存储静态引用实例方法?

时间:2011-08-09 22:56:33

标签: c# delegates lambda

我想创建一个包含委托的静态数组。我将使用此数组来查找我需要的委托。例如:

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,所以不必为我的每个实例初始化它。有没有办法在静态数组中存储实例方法?

3 个答案:

答案 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 } );