2014-04-10 3 views
-2

Я новичок в C#, и у меня возникла небольшая проблема с вызовом функции из метода Main().Функция вызова из Main()

class Program 
{ 
    static void Main(string[] args) 
    { 
     test(); 
    } 

    public void test() 
    { 
     MethodInfo mi = this.GetType().GetMethod("test2"); 
     mi.Invoke(this, null); 
    } 

    public void test2() 
    { 
     Console.WriteLine("Test2"); 
    } 
} 

Я получаю ошибку компиляции в test();:

Ссылка на объект необходим для не-статического поля.

Я еще не совсем понимаю эти модификаторы, но что я делаю неправильно?

Что я действительно хочу сделать, это код test() внутри Main(), но он дает мне ошибку, когда я это делаю.

+0

Поскольку сообщение об ошибке говорит вам, что вам нужна ссылка на объект для вызова нестатического члена. Поэтому создайте ссылку на объект. – Servy

+0

Из метода? Как можно сделать объект из метода? или вы имеете в виду, что я должен поставить тест() в новый класс? – Arbitur

+0

Вам нужен экземпляр типа, в котором этот метод определен, чтобы вызвать метод экземпляра этого типа. Точно так же верно в obj-c, я уверен. – Servy

ответ

1

Просто поместите всю логику в другой класс

class Class1 
    { 
     public void test() 
     { 
      MethodInfo mi = this.GetType().GetMethod("test2"); 
      mi.Invoke(this, null); 
     } 
     public void test2() 
     { 
      Console.Out.WriteLine("Test2"); 
     } 
    } 

и

static void Main(string[] args) 
     { 
      var class1 = new Class1(); 
      class1.test(); 
     } 
+1

Это сработало, C# странно: S – Arbitur

1

Метод должен быть статическим для его вызова.

+1

Это проблема, которую я не могу использовать MethodInfo в статическом методе. – Arbitur

+0

Метод не является статическим. –

+1

@Arbitur Тип статического метода всегда известен во время компиляции; нет необходимости получать его динамически. – Servy

2

Если вы все еще хотите иметь test() как метод экземпляра:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     p.test(); 
    } 

    void Test() 
    { 
     // I'm NOT static 
     // I belong to an instance of the 'Program' class 
     // You must have an instance to call me 
    } 
} 

или, вернее, сделать его статическим :

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test(); 
    } 

    static void Test() 
    { 
     // I'm static 
     // You can call me from another static method 
    } 
} 

Чтобы получить информацию о статическом методе:

typeof(Program).GetMethod("Test", BindingFlags.Static); 
+0

+1 для понятных пояснений модификатора :) – Arbitur

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