class Program
{
static void Main(string[] args)
{
HomeFurniture homeFur = new HomeFurniture();
Check<HomeFurniture,Furniture>(homeFur);
OfficeFurniture officeFur = new OfficeFurniture();
Check<OfficeFurniture,Furniture>(officeFur);
}
public static void Check<U,T>(T check) where T:Furniture
where U:T
{
// I would like to set the properties of HomeFurniture as
// MyProperty = 9;
// and that of OfficeFurniture as
// MyProperty = 10;
}
public class HomeFurniture : Furniture
{
public int MyProperty { get; set; }
}
public class OfficeFurniture: Furniture
{
public int MyProperty { get; set; }
}
public class Furniture
{
}
}
ответ
HomeFurniture h = check as HomeFurniture;
if(h != null) {
if(h.MyProperty != 9) { ... do some thing ...}
} else {
OfficeFurniture o = check as OfficeFurniture;
if(o != null) {
if(o.MyProperty != 10) { ... do some thing ...}
}
}
Если я понимаю ваш вопрос, вы хотите специализироваться вашу общую функцию для каждого вида мебели?
Если так, к сожалению, C# не поддерживает специализацию дженериков. Вы ограничены реализацией своей функции, используя интерфейс, гарантированный вашими предложениями «где».
Вы также можете исследовать свои типы с использованием отражения, но это будет непросто и трудно поддерживать (и полностью разрушить цель наследования).
Я рекомендую использовать ваш класс мебели, чтобы объявить виртуальный метод, чтобы установить свойство, которое вы переопределяете в своих производных классах HomeMurniture и OfficeMurniture.
Например:
public class Furniture {
public virtual void SetProperty(int val);
}
public class HomeFurniture {
public override void SetProperty(int val) { // do homefurniture specific things
}
}
И так далее.
К сожалению, генераторы не помогут вам здесь. Лучший способ справиться с этим, чтобы изменить Check
быть что-то вроде этого:
public static void Check(Furniture check)
{
HomeFurniture homeFurniture = check as HomeFurniture;
if (homeFurniture != null)
{
homeFurniture.MyProperty = 9;
return;
}
OfficeFurniture officeFurniture = check as OfficeFurniture;
if (officeFurniture != null)
{
officeFurniture.MyProperty = 10;
return;
}
}
Почему вы не объявить MyProperty
в Furniture
классе, а затем заменить его?
Пример:
public class Furniture
{
public virtual int MyProperty {get;}
}
public class HomeFurniture : Furniture
{
public override int MyProperty
{
get
{
return 9;
}
}
}
public class OfficeFurniture : Furniture
{
public override int MyProperty
{
get
{
return 10;
}
}
}
Если Check
зависит от конкретного вида мебели, это не было бы родовым больше.
Простой единичная диспетчеризация должна быть все, что вам нужно здесь:
public void Check(HomeFurniture f)
{
f.MyProperty = 9;
}
public void Check(OfficeFurniture f)
{
f.MyProperty = 10;
}
Я не понимаю необходимость общего типа для проверки (проверка T), почему не только Проверьте (проверка мебели) – andleer