从静态方法c#调用非静态方法

本文关键字:静态方法 调用 | 更新日期: 2023-09-27 18:02:10

可能重复:
从静态方法c#调用非静态方法

我们可以从创建实例的静态方法调用非静态方法。代码:

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

然而,我听说可以在委托的帮助下从静态方法调用非静态方法。这是真的吗?如果是,那么怎么做?请用示例代码指导我。谢谢

从静态方法c#调用非静态方法

这是一个通过委托调用非静态方法的方法。请注意,这是一个分两步的过程,因为要调用非静态方法,您绝对需要该类的一个实例。我还要注意的是,几乎可以肯定有一种更好的方法来做你想做的事情,因为需要从静态方法调用非静态方法,尽管不想使用对象实例,这听起来像是非静态方法应该是静态的。

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

要调用一个非静态方法,您需要一个对象的实例——这是无法解决的。

是的,您可以使用委托从任何地方调用非静态方法,但您需要该类的实例来创建委托,以便在调用该方法时该实例可用。

您总是需要一个实例来调用实例方法。可以有一个指向实例上某个方法的委托,但您仍然有一个正在调用中使用的实例,只是间接的。

您可以做其他聪明的事情,但现实是,在这一过程中,您必须在某个地方创建或访问非静态对象的实例。您可以将delgate传递到方法中,它引用方法的实例(更确切地说,是非静态对象实例上的方法(,但必须在代码之外创建。

在提供的代码中,您没有在静态方法中调用非静态方法,而是调用另一个类的实例公共方法,这是不同的情况。

所以在你的情况下,我建议写一些类似的东西:

静态空数据2(Foo-Foo(。

谨致问候。

通过这种方式,它可以从静态方法中被称为非静态方法。要从静态方法调用非静态方法,必须创建非静态方法所在类的新引用。因此,您的Data1方法在Foo类中,您必须创建一个新的reference(Foo-Foo=new Foo(((才能退出静态方法。