2009-03-19 2 views
2
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 
    { 


    } 
} 
+0

Я не понимаю необходимость общего типа для проверки (проверка T), почему не только Проверьте (проверка мебели) – andleer

ответ

1
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 ...} 
    } 
} 
0

Если я понимаю ваш вопрос, вы хотите специализироваться вашу общую функцию для каждого вида мебели?

Если так, к сожалению, 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 
    } 
} 

И так далее.

1

К сожалению, генераторы не помогут вам здесь. Лучший способ справиться с этим, чтобы изменить 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; 
    } 
} 
3

Почему вы не объявить 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; 
     } 
    } 
} 
2

Если Check зависит от конкретного вида мебели, это не было бы родовым больше.

Простой единичная диспетчеризация должна быть все, что вам нужно здесь:

public void Check(HomeFurniture f) 
{ 
    f.MyProperty = 9; 
} 

public void Check(OfficeFurniture f) 
{ 
    f.MyProperty = 10; 
}