2014-07-25 2 views
-1

두 개의 클래스 CarTruck이 있으며 모두 Vehicle 클래스를 확장합니다.속성을 제네릭 매개 변수로 설정

public int Wheels { get; set; } 

지금, 나는 몇 가지 변수에 Wheels 속성을 설정하는 두 가지 방법이 있습니다 CarTruck 모두는 다음과 같습니다 속성이 있습니다. 그것은 다음과 같습니다

public void SetCarWheels(int value) 
{ 
    Car.Wheels = value; 
} 

public void SetTruckWheels(int value) 
{ 
    Truck.Wheels = value; 
} 

방법이 같은 일을하기 때문에, 내가 유형 Vehicle의 입력 매개 변수있을 것입니다 방법을 만들고 싶었다. 이 방법은 기본적으로이 작업을 수행해야합니다

는 문제가
public static void SetWheels<T>(Vehicle item, int wheels) where T : Vehicle 
    { 
     if (item!= null) 
     { 
      item.Wheels = wheels; 
     } 
    } 

, 그것은 Wheels 속성을 인식하지 못합니다.

제네릭을 사용하여 어떻게 해결할 수 있습니까?

제네릭없이 대체 솔루션을 제안하지 마십시오. (CarTruck은 바퀴의 const 값을 가질 수 있지만이 문제는 그대로 두십시오).

+1

'alreadySelectedItem' 유형은 무엇입니까? 왜'SetWheels'가 제네릭인가? 'T '는 코드의 어느 곳에서나 사용하지 않는다. –

+1

previousSelectedItem 객체를 어디서 어떻게 선언하고 있습니까? –

+1

은 지저분 해 보입니다. 예를 들어,'무엇이'priorSelectedItem'입니까? - 당신은'SetWheels'에'T' 나'item'을 사용하지 않고'Wheels' 속성은 공용 설정자를 가지고 있습니다 .... – Carsten

답변

3

이 건물은 Vehicle 기본 클래스의 인스턴스 속성 인 경우 귀하의 코드에만 작동합니다 :

public class Vehicle 
{ 
    public int Wheels { get; set; } 
} 

또한, 당신의 방법에 당신은 제네릭 형식 매개 변수와 변수를 사용하지 않는 것이 :

public static void SetWheels<T>(T item, int wheels) where T : Vehicle 
{ 
    if (item != null) 
    { 
     item.Wheels = wheels; 
    } 
} 
+0

나는 그렇게 생각하지 않는다. 비록 그가 그렇게 말하지 않더라도 그 속성은 정적이라고 보인다. 그리고 코드는 단지 제공된 유형을 체크하면 작동 할 수있다. (절름발이 동적 디스패치) – Carsten

+0

실제로 가능하다. 그래서 내 코드처럼 'Vehicle'의 인스턴스 변수 여야합니다. –

+2

@ CarstenKönig'Car'와'Truck' 둘 다'Wheels'라는 속성을 가지고 있다고 생각합니다.하지만 그 기본 클래스는 Vehicle이 아닙니다. –

관련 문제