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