Я хочу знать, возможно ли что-то подобное в С#.
Предположим, у меня также есть класс "Родитель" и два класса, которые наследуются от класса "Родитель", называемого "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);
Я хочу создать конструктор с использованием обобщенного и сравнить тип родового. Это возможно?
Если оба дочерних класса наследуются от 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
}
}
или просто добавить перегрузки (возможно, рефакторинг любой "общей" койды в отдельные методы:
///<summary>
/// Constructor for my form.
///</summary>
public FrmMainForm(Child1 thisChild)
{
// Do something
}
public FrmMainForm(Child2 thisChild)
{
// Do something else
}
У вас не может быть конструктора, который делает это, но у вас может быть общий заводский метод, который делает это:
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
.
Вы не должны использовать отражение, чтобы проверить тип выполнения объекта здесь. Вместо этого вы должны использовать полиморфизм, чтобы позволить вам относиться ко всем объектам одинаково, и каждый из них индивидуально работает отдельно, основываясь на своих собственных определениях.
Родительский тип должен определять набор методов/свойств, которые представляют операции, которые вы хотите выполнять на любом из этих типов объектов, каждый дочерний объект может затем реализовать методы/свойства, как им нужно, чтобы они надлежащим образом функционировали для их конкретные различия.
virtual
методы / свойства в родительском классе иoverride
их в дочерних классах. Тогда вы не привязаны к определенным классам (кроме родительских).