有条件地在C#中实例化一个类

时间:2011-07-13 14:04:33

标签: c# system.reflection

我一直在试图让新代码工作。我已经能够通过if语句以更简单但更广泛的方式完成此操作。但是,由于这将是应用程序的第2版,我希望使代码更清洁,更高效。

我想要做的是有条件地实例化一个类。它会是这样的:

int Airplane = 195;

if (Airplane == 190)
    _E190 Aircraft = new _E190();

else if (Airplane == 195)
    _E195 Aircraft = new _E195();

我有两个类,但我想使用关键字“Aircraft”,所以我不必为每个类创建多个代码部分。我还发现C#中没有多重继承(在我看来,它会做到这一点),而且我对这种语言相对较新。

到目前为止,我已经完成了以我想要的方式实例化类,但我似乎无法使用每个类中声明的变量。我这样做了:

    int Airplane = 195;

    var Aircraft = Activator.CreateInstance( (Airplane == 195) ? typeof(_E195) : typeof(_E190));
    MessageBox.Show(Aircraft.GetType().ToString());

MessageBox正确显示了类型,但同样,我无法使用“Aircraft”对象访问类本身。我确信有更多的方法可以做到这一点,但其中任何一个对我都没问题。

谢谢!

3 个答案:

答案 0 :(得分:12)

我认为它们都是从其他东西继承而来的,这就是你需要多重继承的原因?

建立一个界面(IAircraft)并让它们都实现它。

interface IAircraft {
    /* Common methods here */
}

class _E190 : TheParentClass, IAircraft {
    /* Your code */
}

class _E195 : TheOtherParentClass, IAircraft {
    /* Your code */
}

/* ... */

int Airplane = 195;
IAircraft Aircraft;

if (Airplane == 190)
    Aircraft = new _E190();
else if (Airplane == 195)
    Aircraft = new _E195();

您无法使用以前的方法访问该类的原因是,为此,编译器需要知道它是什么类型的类。要做到这一点,你需要将它转换为适当的类型......但这会让你回到同样的问题。您可以使用反射方法继续使用它,但使用继承或实现它会更有效和干净。

答案 1 :(得分:4)

为什么不定义类似

的内容
public abstract class Aircraft
{
}

public class _E190 : Aircraft
{
}


public class _E195 : Aircraft
{
}

然后执行以下操作:

Aircraft Aircraft;
int Airplane = 195;

if (Airplane == 190)
    Aircraft = new _E190();

else if (Airplane == 195)
    Aircraft = new _E195();

编辑:此外,正如其他人建议的那样,您可以使用界面而不是抽象类。请注意,在这种情况下,您必须双重定义所有常见属性和方法(如果有)。

答案 2 :(得分:2)

阅读对象工厂模式