Подтвердить что ты не робот

Как вызвать нестатический метод из статического метода в С#?

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

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

Ответ 1

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

public class Foo
{
    public void Data1()
    {
    }

    public static void Data2()
    {
         Foo foo = new Foo();
         foo.Data1();
    }
}

Ответ 2

Возможно, вы ищете шаблон 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();
}

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

Ответ 3

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

Например, например:

public class MyClass
{
   private void data1()
   {
   }
   private static void data2()
   {
     MyClass c = new MyClass();
     c.data1();
   }
}

Ответ 4

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

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

Vehicle myCar = new Vehicle();

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

myCar.Drive();

Ответ 5

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

private static void data2()
{
    <classname> c1 = new <classname>();
    c1. data1();
}

Ответ 6

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

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

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();
        }
    }
}

Ответ 7

Предполагая, что оба data1() и data2() находятся в одном классе, то другой альтернативой является создание data1() static.

private static void data1()
{
}
private static void data2()
{
   data1();
}

Ответ 8

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

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

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

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

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

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

non-static method()
{

}


}

Ответ 9

Вы можете использовать метод вызова следующим образом: 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();
    }
}