У меня есть следующий код, я хочу вызвать data1()
из data2()
. Возможно ли это на С#? Если да, то как?
private void data1()
{
}
private static void data2()
{
data1(); //generates error
}
У меня есть следующий код, я хочу вызвать data1()
из data2()
. Возможно ли это на С#? Если да, то как?
private void data1()
{
}
private static void data2()
{
data1(); //generates error
}
Вам нужно будет создать экземпляр класса и вызвать метод на нем.
public class Foo
{
public void Data1()
{
}
public static void Data2()
{
Foo foo = new Foo();
foo.Data1();
}
}
Возможно, вы ищете шаблон 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();
}
Вам все равно нужно создать экземпляр класса, но вы убедитесь, что есть только один экземпляр.
Вам нужно создать экземпляр этого класса внутри статического метода, а затем вызвать его.
Например, например:
public class MyClass
{
private void data1()
{
}
private static void data2()
{
MyClass c = new MyClass();
c.data1();
}
}
Вы не можете вызвать нестатический метод без предварительного создания экземпляра его родительского класса.
Итак, из статического метода вам нужно создать экземпляр нового объекта...
Vehicle myCar = new Vehicle();
... и затем вызовите нестатический метод.
myCar.Drive();
Вам просто нужно предоставить ссылку на объект. Укажите свое имя класса в позиции.
private static void data2()
{
<classname> c1 = new <classname>();
c1. data1();
}
Извинился, чтобы отправить ответ на очень старый поток, но я верю, что мой ответ может помочь другим.
С помощью делегата можно добиться того же.
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();
}
}
}
Предполагая, что оба data1()
и data2()
находятся в одном классе, то другой альтернативой является создание data1()
static.
private static void data1()
{
}
private static void data2()
{
data1();
}
Статический метод никогда не позволяет напрямую обращаться к нестационарному методу.
Причина: статический метод относится только к его классу, а также к объекту или любому экземпляру.
Итак, всякий раз, когда вы пытаетесь получить доступ к нестационарному методу из статического метода внутри одного класса: вы получите:
"Ссылка на объект требуется для нестатического поля, метода или свойства".
Решение: просто объявите ссылку как:
public class <classname>
{
static method()
{
new <classname>.non-static();
}
non-static method()
{
}
}
Вы можете использовать метод вызова следующим образом: 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();
}
}