Как мне вызвать нестатический метод из статического метода в C #? - PullRequest
58 голосов
/ 01 сентября 2009

У меня есть следующий код, я хочу позвонить data1() с data2(). Возможно ли это в C #? Если да, то как?

private void data1()
{
}
private static void data2()
{
   data1(); //generates error
}

Ответы [ 9 ]

106 голосов
/ 01 сентября 2009

Вам нужно будет создать экземпляр класса и вызвать для него метод.

public class Foo
{
    public void Data1()
    {
    }

    public static void Data2()
    {
         Foo foo = new Foo();
         foo.Data1();
    }
}
26 голосов
/ 01 сентября 2009

Возможно, вы ищете шаблон Singleton?

public class Singleton
{
    private Singleton() {}

    public void DoWork()
    { 
        // do something
    }

    // You can call this static method which calls the singleton instance method.
    public static void DoSomeWork()
    { 
        Instance.DoWork();
    }

    public static Singleton Instance
    {
        get { return instance; } 
    }

    private static Singleton instance = new Singleton();
}

Вам все еще нужно создать экземпляр класса, но вы гарантируете, что только один экземпляр.

17 голосов
/ 01 сентября 2009

Вы должны создать экземпляр этого класса в статическом методе и затем вызвать его.

Например, вот так:

public class MyClass
{
   private void data1()
   {
   }
   private static void data2()
   {
     MyClass c = new MyClass();
     c.data1();
   }
}
10 голосов
/ 01 сентября 2009

Нельзя вызывать нестатический метод без предварительного создания экземпляра его родительского класса.

Так что из статического метода вам нужно будет создать новый объект ...

Vehicle myCar = new Vehicle();

... и затем вызовите нестатический метод.

myCar.Drive();
6 голосов
/ 19 марта 2013

Вам просто нужно предоставить ссылку на объект. Пожалуйста, укажите название вашего класса в позиции.

private static void data2()
{
    <classname> c1 = new <classname>();
    c1. data1();
}
4 голосов
/ 16 сентября 2015

Извиняюсь за публикацию ответа для очень старой темы, но я верю, что мой ответ может помочь другим.

С помощью делегата может быть достигнуто то же самое.

public class MyClass
{
    private static Action NonStaticDelegate;

    public void NonStaticMethod()
    {
        Console.WriteLine("Non-Static!");
    }

    public static void CaptureDelegate()
    {
        MyClass temp = new MyClass();
        MyClass.NonStaticDelegate = new Action(temp.NonStaticMethod);
    }

    public static void RunNonStaticMethod()
    {
        if (MyClass.NonStaticDelegate != null)
        {
            // This will run the non-static method.
            //  Note that you still needed to create an instance beforehand
            MyClass.NonStaticDelegate();
        }
    }
}
0 голосов
/ 28 декабря 2017

Вы можете использовать метод вызова следующим образом: Foo.Data2 ()

public class Foo
{
    private static Foo _Instance;

    private Foo()
    {
    }

    public static Foo GetInstance()
    {
        if (_Instance == null)
            _Instance = new Foo();
        return _Instance;
    }

    protected void Data1()
    {
    }

    public static void Data2()
    {
        GetInstance().Data1();
    }
}
0 голосов
/ 06 июля 2016

Статический метод никогда не разрешает вызов нестатического метода напрямую.

Причина: статический метод относится только к своему классу и к любому объекту или любому экземпляру.

Таким образом, всякий раз, когда вы пытаетесь получить доступ к любому нестатическому методу из статического метода внутри того же класса: вы получите:

«Ссылка на объект требуется для нестатического поля, метода или свойства».

Решение: Просто объявите ссылку как:

public class <classname>
{
static method()
{
   new <classname>.non-static();
}

non-static method()
{

}


}
0 голосов
/ 28 августа 2014

Если предположить, что data1() и data2() принадлежат к одному и тому же классу, то другой альтернативой является сделать data1() статическим.

private static void data1()
{
}
private static void data2()
{
   data1();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...