具有类型比较的通用构造函数

时间:2014-08-26 18:26:14

标签: c# .net winforms

我想知道C#中是否有类似的东西。

假设我还有一个名为“Parent”的类和两个继承自“Parent”类的子类,名为“Child1”和“Child2”。

///<summary>
/// Constructor for my form.
///</summary>
public FrmMainForm<T>(T thisChild)
{
    if(thisChild.GetType() == typeof(Child1)
    {
        // Do something
    }
    else if(thisChild.GetType() == typeof(Child2)
    {
        // Do something else
    }
}

使用构造函数调用它的代码可能如下所示:

FrmMainForm thisForm = FrmMainForm<Child1>(childObjectToPassIn);

我想使用泛型创建构造函数并比较泛型的类型。这可能吗?

3 个答案:

答案 0 :(得分:2)

如果两个子类都继承自Parent并且您正在使用类型检查,那么只需创建Parent类型的参数:

///<summary>
/// Constructor for my form.
///</summary>
public FrmMainForm(Parent thisChild)
{
    if(thisChild.GetType() == typeof(Child1)
    {
        // Do something
    }
    else if(thisChild.GetType() == typeof(Child2)
    {
        // Do something else
    }
}

或者只是添加重载(可能将任何“常见”coide重构为单独的方法:

///<summary>
/// Constructor for my form.
///</summary>
public FrmMainForm(Child1 thisChild)
{
    // Do something
}

public FrmMainForm(Child2 thisChild)
{
    // Do something else
}

答案 1 :(得分:1)

你不能有一个构造函数,但你可以有一个通用的工厂方法来做到这一点:

public FrmMainForm Create<T>(T thisChild) where T : Parent
{
    FrmMainForm result = new FrmMainForm();

    if(thisChild.GetType() == typeof(Child1)
    {
        // Do something
    }
    else if(thisChild.GetType() == typeof(Child2)
    {
        // Do something else
    }

    // return your form
}

如果你制作构造函数private,这将成为构建表单的唯一方法。

话虽如此,开启类型几乎总是表明设计不佳。我建议您根据两种子类型重新考虑为什么您想要不同的行为,以及是否可以将其重构为直接在Parent类上调用的单个方法。

答案 2 :(得分:0)

您不应该使用反射来检查对象的运行时类型。相反,您应该使用多态来允许您以相同的方式处理所有对象,并让它们各自根据自己的定义单独运行。

父类型应该定义一组方法/属性,这些方法/属性表示您要对任何这些类型的对象执行的操作,然后每个子对象可以根据需要实现方法/属性,以便它们能够适合他们的具体差异。