2010-04-22 4 views
0

개체 컬렉션이있는 작업자 클래스가 있습니다. 두 개의 속성을 갖기 위해 각각의 객체가 필요합니다. 하나는 알 수없는 유형이고 하나는 숫자 여야합니다.C# 제네릭 집합을 구현하는 방법

다른 속성을 허용하지만 작업자 클래스에 필요한 PropA 및 PropB가 있어야하는 여러 항목 클래스를 가질 수 있도록 인터페이스를 사용하려고했습니다.

이것은 지금까지 가지고있는 코드입니다. 사용하려고 시도 할 때까지는 괜찮은 것 같습니다. MyItem이 IItem을 구현하더라도 Myitem 목록은 IItem 목록으로 전달 될 수 없습니다. 이것은 내가 혼란스러워하는 곳입니다.

또한 가능하다면 T를 전달할 필요가없는 작업자 클래스를 인스턴스화 할 때 PropA 유형에 따라 T가 무엇인지 알 수있을 것입니다.

누군가 나를 분류하도록 도와 줄 수 있습니까? 감사합니다.

public interface IItem<T> 
{ 
    T PropA { get; set; } 
    decimal PropB { get; set; } 
} 

public class MyItem : IItem<string> 
{ 
    public string PropA { get; set; } 
    public decimal PropB { get; set; } 
} 

public class WorkerClass<T> 
{ 
    private List<T> _list; 

    public WorkerClass(IEnumerable<IItem<T>> items) 
    { 
     doStuff(items); 
    } 
    public T ReturnAnItem() 
    { 
     return _list[0]; 
    } 
    private void doStuff(IEnumerable<IItem<T>> items) 
    { 
     foreach (IItem<T> item in items) 
     { 
      _list.Add(item.PropA); 
     } 
    } 
} 
public void usage() 
{ 
    IEnumerable<MyItem> list= GetItems(); 
    var worker = new WorkerClass<string>(list);//Not Allowed 
} 

답변

3

구체적인 유형 대신 직접 인터페이스를 제공하면이 기능을 사용할 수 있습니다. 단지 당신을 위해 암시 적 변환을 수행 할 수 없습니다 : 원래 코드가 실제로 IEnumerable<T>covariance을 지원하는 C# 4에서 작동합니다 : 여담에

IEnumerable<IItem<string>> items = GetItems().Cast<IItem<string>>(); 
var worker = new WorkerClass<string>(items); 

. 그러나 이전 버전의 C#에서는 오류가 발생합니다.

+0

@Aaaronaught : 프로그래밍 언어가 이제는 (적어도 다음 버전에서) 흥미 롭다면 프로그래머가 생각한 프로그래머의 코드 작업을 처음부터해야한다고 생각해보십시오. C#에서 개선 된 점을 좋아합니다. 그 공분산을 읽을테니까 – Hao

+0

그게 효과가있어, 고마워! 이 문제에 접근하는 간단한 방법이 있습니까? 아니면 올바른 방향으로 가고 있습니까? – Amy

+0

@Amy : 'WorkerClass'가 무엇을하는지 또는 'Item'객체가 무엇인지 모르게 말하기는 어렵습니다. 제네릭 형식/인터페이스를 파생시키고 추가로 제한하는 것이 좋습니다. 나는 항상 이것을한다. – Aaronaught

관련 문제