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

hen*_*que 3 c# system.reflection

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

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

int Airplane = 195;

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

else if (Airplane == 195)
    _E195 Aircraft = new _E195();
Run Code Online (Sandbox Code Playgroud)

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

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

    int Airplane = 195;

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

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

谢谢!

Ry-*_*Ry- 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();
Run Code Online (Sandbox Code Playgroud)

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

  • +1,这是正确的.我认为OP的问题是他想通过自动完成访问_E190/5特定字段,但这是不可能的.如果你能解释原因,那就完美了. (2认同)