Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个非静态类如何调用另一个非静态类';什么方法?_C#_Non Static - Fatal编程技术网

C# 一个非静态类如何调用另一个非静态类';什么方法?

C# 一个非静态类如何调用另一个非静态类';什么方法?,c#,non-static,C#,Non Static,我有两个类都是非静态的。我需要访问一个类上的方法以返回一个对象进行处理。但由于这两个类都是非静态的,所以我不能仅仅以静态方式调用该方法。我也不能以非静态方式调用该方法,因为程序不知道对象的标识符 首先,如果可能的话,我希望这两个对象都保持非静态。否则,它将需要对代码的其余部分进行大量重组 下面是代码中的示例 class Foo { Bar b1 = new Bar(); public object MethodToCall(){ /*Method body here*/ } }

我有两个类都是非静态的。我需要访问一个类上的方法以返回一个对象进行处理。但由于这两个类都是非静态的,所以我不能仅仅以静态方式调用该方法。我也不能以非静态方式调用该方法,因为程序不知道对象的标识符

首先,如果可能的话,我希望这两个对象都保持非静态。否则,它将需要对代码的其余部分进行大量重组

下面是代码中的示例

class Foo
{
    Bar b1 = new Bar();

    public object MethodToCall(){ /*Method body here*/ }
}

Class Bar
{
    public Bar() { /*Constructor here*/ }

    public void MethodCaller()
    {
        //How can i call MethodToCall() from here?
    }
}

顺便说一句,一般来说,对象没有名称。

通过将实例传递给构造函数:

class Bar
{
    private Foo foo;

    public Bar(Foo foo)
    { 
        _foo = foo;
    }

    public void MethodCaller()
    {
        _foo.MethodToCall();
    }
}
用法:

Foo foo = new Foo();
Bar bar = new Bar(foo);
bar.MethodCaller();

为了使静态或非静态类中的任何代码调用非静态方法,调用方必须具有对调用对象的引用

在您的情况下,
Bar
MethodCaller
必须引用
Foo
。您可以通过
Bar
的构造函数或任何其他方式传递它:

class Foo
{
    Bar b1 = new Bar(this);

    public object MethodToCall(){ /*Method body here*/ }
}

Class Bar
{
    private readonly Foo foo;

    public Bar(Foo foo) {
        // Save a reference to Foo so that we could use it later
        this.foo = foo;
    }

    public void MethodCaller()
    {
        // Now that we have a reference to Foo, we can use it to make a call
        foo.MethodToCall();
    }
}
试试这个:

class Foo
{
    public Foo() { /*Constructor here*/ }
    Bar b1 = new Bar();

    public object MethodToCall(){ /*Method body here*/ }
}

Class Bar
{
    public Bar() { /*Constructor here*/ }
    Foo f1 = new Foo();
    public void MethodCaller()
    {
        f1.MethodToCall();
    }
}

基本上,您希望执行类似于
newfoo().MethodToCall()的操作
我想……您需要
Bar
类中的
Foo
类的对象,然后调用该类的实例方法。或者您可以将类型为
Foo
的参数传递给
Bar
类中的方法。
我也不能以非静态方式调用该方法,因为程序不知道对象的名称。
wutYou确实知道您可以将方法设置为静态,但不能将类设置为静态,对吗?即使您的要求是可能的,也没有任何意义。考虑在类上添加静态重载。这种方法可以根据情况进行静态调用和常规调用。这会起作用,但会创建一个新的Foo实例,我不希望发生这种情况。Foo中的变量仍将保留在旧实例中,而新实例
x
将有一组新的变量。另外,我对术语还不熟悉,我的意思是说reference/identifier而不是name:p这将在Bar中重新创建一个Foo的新实例。我想在Foo中处理对象,而不是在Foo的新实例中。
class Foo
{
    public Foo() { /*Constructor here*/ }
    Bar b1 = new Bar();

    public object MethodToCall(){ /*Method body here*/ }
}

Class Bar
{
    public Bar() { /*Constructor here*/ }
    Foo f1 = new Foo();
    public void MethodCaller()
    {
        f1.MethodToCall();
    }
}