“存储”一个类来调用静态方法

时间:2011-12-02 14:44:26

标签: c#

假设我有类A,它调用类B或类C中的静态方法。它将调用哪个类将取决于在类A的构造函数中传递的参数。类B和C中的方法需要被称为具有相同的方法签名。那么,有没有办法做类似的事情:

Object call;
if (type == 0)
    call = ClassA;
else
    call = ClassB;

call.someMethod ();

我知道可以使用接口完成,并且让B类和C类都实现接口,但是每次上面的调用都需要创建一个B或C的对象,这是非常耗费资源的。所以,我想知道是否有其他方法可以做到这一点。

编辑:对不起,如果这不清楚,但Object call是一个类变量,方法调用B类,C需要在类中的其他方法中进行,而不仅仅是构造函数。

5 个答案:

答案 0 :(得分:5)

不要使用静态方法。使用接口(或基类),创建两个类的单个实例并将它们存储在静态字段中。这样,您不必每次都实例化,只需从字段中获取现有实例。

答案 1 :(得分:4)

由于这些方法是静态的,我假设我们正在讨论你不能控制的类中的辅助方法(否则你可以将它们移动到同一个类中)。在任何情况下,您都可以使用以下适用于各种情况的方法:

使用包含指向相关方法的Action的变量。例如:

Action action;
if (type == 0) 
    action = ClassA.SomeMethod;
else 
    action = ClassB.SomeOtherMethod;

action(); 

当然,如果要将参数传递给被调用的方法,也可以使用其他委托类型(例如Action的通用版本)。

使用此方法的一个限制是,您可能要调用的所有方法都需要具有相同的签名(参数的数量和类型)以及相同的返回类型。但是你仍然可以通过构建适配器函数来解决这个问题,这很容易使用lambdas:

// Assume that ClassA.SomeMethod accepts an int parameter
// If you know the value that should be passed, you can adapt it like this:
if (type == 0) 
    action = () => { ClassA.SomeMethod(42); };

答案 2 :(得分:1)

为什么不在if()语句中调用方法?

if( type == 0 )
{
    ClassA.someMethod();
}
else
{
    ClassB.someMethod();
}

如果你需要对方法的返回值做一些事情,那么仍然可以通过在语句外声明返回对象并在条件块中为其赋值。

答案 3 :(得分:1)

嗯,使用if else设置变量来调用公共函数。正如你打算有if / else一样,为什么不这样做......

if (type == 0)
    ClassA.SomeMethod();
else
    ClassB.SomeMethod();

答案 4 :(得分:0)

在您的示例中,您没有创建任何对象。

调用是静态的,因此不需要创建对象。