2014-09-13 2 views
2

Я новичок в этом (и ничего, что я читал или не пробовал, сработал).Как вернуть действие из функции?

Я хотел бы использовать функцию вида:

Func<string, Action> getAction = (editingmark) => 
    { 
     Action doit; 
     switch (editingmark) 
     { 
      case ">": 
       doit = editRx; <--ERROR OCCURS HERE. 
       break; 
     } 
     return doit; 
    }; 

где editRx имеет вид:

Action editRx =() => 
    { 
    }; 

и я получаю:

Поле инициализатор не может ссылаться на не- статическое поле, метод или свойство ... editRx

Что делать? (и есть ли лучший способ?)

Спасибо за помощь.

+0

Возможно, 'editRx' выходит за рамки? – Mephy

+2

отметьте 'editRx' как' static' –

+0

Скорее всего вы объявляете встроенный статический метод 'Func', и Action объявляется, например. –

ответ

4

Похоже, вы пытаетесь инициализировать getAction как поле, как это:

public class Foo 
{ 
    Action editRx =() => 
    { 
    }; 
    Func<string, Action> getAction = (editingmark) => 
    { 
     Action doit = null; 
     switch (editingmark) 
     { 
      case ">": 
       doit = editRx; 
       break; 
     } 
     return doit; 
    }; 
} 

Проблема здесь в том, что вы пытаетесь make инициализировать getAction с закрытием около editRx, но вы не можете сделать это в инициализаторе поля. Попробуйте поместить это в конструкторе вместо:

public class Foo 
{ 
    Action editRx =() => 
    { 
    }; 
    Func<string, Action> getAction; 

    public Foo() 
    { 
     this.getAction = (editingmark) => 
     { 
      Action doit; 
      switch (editingmark) 
      { 
       case ">": 
        doit = editRx; 
        break; 
      } 
      return doit; 
     }; 
    } 
} 

отметить также, что с помощью делегатов, как это немного нетрадиционный для C#. Вероятно, вы можете реорганизовать это на обычный метод или другую конструкцию ООП и сделать код более понятным и понятным. Как только вы получите свой код Я рекомендую вам задать вопрос о том, как вы можете реорганизовать свой код во что-то более идиоматическое.

+0

Вышеприведенный код находится в базовом классе для наследования. Метод editRx будет делать разные вещи в зависимости от дочернего элемента наследования. Я думал, что это будет самый простой подход. Есть ли лучший? –

+0

@AlanWayne Возможно, с помощью [методов переопределения] (http://msdn.microsoft.com/en-us/library/ebca9ah3.aspx). –

2

Проверьте это, пожалуйста,

Func<string, Action> getAction = (editingmark) => 
{ 
    Action doit = null; 
    switch (editingmark) 
    { 
     case ">": 
      doit = editRx; 
      break; 
    } 
    return doit; 
}; 
static readonly Action editRx =() => 
{ 
}; 
Смежные вопросы