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

C# 在C中有条件地实例化一个类#,c#,system.reflection,C#,System.reflection,我一直在努力使新代码生效。我已经能够通过if语句以一种更简单但更广泛的方式完成这项工作。但是,由于这将是应用程序的第2版,我希望代码更干净、更高效 我试图做的是有条件地实例化一个类。它是这样的: int Airplane = 195; if (Airplane == 190) _E190 Aircraft = new _E190(); else if (Airplane == 195) _E195 Aircraft = new _E195(); 我有两个类,但我想使用关键字

我一直在努力使新代码生效。我已经能够通过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”对象访问类本身。我确信有更多的方法可以做到这一点,但其中任何一种都适合我


谢谢

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

制作一个接口(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();

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

阅读对象工厂模式

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

编辑:此外,正如其他人所建议的,您可以使用接口而不是抽象类。注意,在这种情况下,如果有公共属性和方法,您必须双重定义它们。

+1,这是正确的。我认为OP的问题在于他想通过自动补全访问190/5特定字段,但这是不可能的。如果你能解释一下原因,那就太完美了。工厂确实是一个完美的解决方案,但首先让这个家伙了解继承:)