2016-02-04 7 views
-3

Я хочу использовать этот метод в нестатическом классе:Как я могу использовать статический метод в в нестатической классе

public class LogicalExpressionCalculator : MeasurementInterpreter 
{ 
    private static Boolean Operator(this string logic, string x, string y) 
    { 
     switch (logic) 
     { 
      case "==": return x == y; 
      case "!=": return x != y; 
      case ">": return Int32.Parse(x) > Int32.Parse(y); 
      case ">=": return Int32.Parse(x) >= Int32.Parse(y); 
      case "<": return Int32.Parse(x) < Int32.Parse(y); 
      case "<=": return Int32.Parse(x) <= Int32.Parse(y); 
      case "&&": return bool.Parse(x) && bool.Parse(y); 
      case "||": return bool.Parse(x) || bool.Parse(y); 
      default: throw new Exception("invalid logic"); 
     } 
    } 
} 

Как я могу изменить этот метод работу в не статиках класс?

Метод я хочу использовать внутри класса в этом методе:

protected void CalculateExpression() 
{ 
    Stack variableStack = new Stack(); 
    Stack operatorStack = new Stack(); 
    foreach (string field in contextString) 
    { 
     switch (field) 
     { 
      case "(": 
      case "<": 
      case ">": 
      case "==": 
       operatorStack.Push(field); 
       break; 
      case ")": 
       string operatorPop = null; 
       while (operatorPop == "(") 
       { 

        operatorPop = operatorStack.Pop().ToString(); 
        resultStack = Operator(operatorPop, variableStack.Pop().ToString(), variableStack.Pop().ToString()); 
        variableStack.Push(resultStack); 
       } 
       break; 

      case "UserInput": 
      case "EngineRpm": 
      case "VehicleSpeed": 
       variableStack.Push((string)hashtable[field]); 
       break; 

      default: 
       int integer; 
       if(Int32.TryParse(field, out integer)) variableStack.Push(integer); 
       if (bool.Parse(field)) variableStack.Push(field); 
       break; 

     } 
    } 

    Result = resultStack; 
    if (Result) 
    { 

    } 
} 

я получаю сообщение об ошибке

метод расширения должен быть статическим

+0

Зачем вам этот метод вообще? Он использует только переменные, переданные как аргументы, поэтому он полностью независим от класса, содержащего его. Что мешает вам использовать его «как есть»? –

+0

Статические элементы могут быть доступны из экземпляров. Правила видимости одинаковы (я упоминаю это, потому что ваш образец содержит метод 'private'). Что * точно * вы хотите сделать, и что происходит не так? – Dennis

+0

Я не могу построить проект, потому что n ошибка «Метод расширения должен быть статическим» –

ответ

1

Удалить this Безразлично» Кажется, что это необходимо.

private static Boolean Operator(string logic, string x, string y) 
{ 
    switch (logic) 
    { 
     case "==": return x == y; 
     case "!=": return x != y; 
     case ">": return Int32.Parse(x) > Int32.Parse(y); 
     case ">=": return Int32.Parse(x) >= Int32.Parse(y); 
     case "<": return Int32.Parse(x) < Int32.Parse(y); 
     case "<=": return Int32.Parse(x) <= Int32.Parse(y); 
     case "&&": return bool.Parse(x) && bool.Parse(y); 
     case "||": return bool.Parse(x) || bool.Parse(y); 
     default: throw new Exception("invalid logic"); 
    } 
} 
+0

, он виден внутри класса, потому что я использовал внутри класса, и я могу его вызвать, но ошибка, которую я получаю, - это метод расширения быть статичным. –

+0

Это связано с тем, что метод расширения всегда должен быть определен в статическом классе. – Bidou

+0

Это метод exetnsion, потому что первый параметр имеет префикс с этим. Это означает, что вы называете это строкой - «....». Оператор («==», «xxx») - Основы C#. Могу ли я предложить изучать язык. Не из howtos, а путем чтения синтаксиса? – TomTom

Смежные вопросы