我想知道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);
我想使用泛型创建构造函数并比较泛型的类型。这可能吗?
答案 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)
您不应该使用反射来检查对象的运行时类型。相反,您应该使用多态来允许您以相同的方式处理所有对象,并让它们各自根据自己的定义单独运行。
父类型应该定义一组方法/属性,这些方法/属性表示您要对任何这些类型的对象执行的操作,然后每个子对象可以根据需要实现方法/属性,以便它们能够适合他们的具体差异。