문제

.NET 제네릭에 문제가 있습니다.내가 하고 싶은 일은 제네릭 유형의 배열(GraphicsItem)을 저장하는 것입니다.

public class GraphicsItem<T>
{
    private T _item;

    public void Load(T item)
    {
        _item = item;
    }
}

이러한 개방형 일반 유형을 배열에 어떻게 저장할 수 있습니까?

도움이 되었습니까?

해결책

제네릭이 아닌 인터페이스를 구현하고 다음을 사용하십시오.

public class GraphicsItem<T> : IGraphicsItem
{
    private T _item;

    public void Load(T item)
    {
        _item = item;
    }

    public void SomethingWhichIsNotGeneric(int i)
    {
        // Code goes here...
    }
}

public interface IGraphicsItem
{
    void SomethingWhichIsNotGeneric(int i);
}

그런 다음 해당 인터페이스를 목록의 항목으로 사용하십시오.

var values = new List<IGraphicsItem>();

다른 팁

이기종 GrpahicsItem을 저장하려는 경우 즉GraphicsItem< X> 및 GrpahicsItem< Y>를 공통 기본 클래스에서 파생시키거나 공통 인터페이스를 구현해야 합니다.또 다른 옵션은 List< object>에 저장하는 것입니다.

제네릭이 아닌 메서드에서 GraphicsItem 배열을 생성하려고 합니까?

다음은 수행할 수 없습니다.

static void foo()
{
  var _bar = List<GraphicsItem<T>>();
}

나중에 목록을 채우세요.

아마도 당신은 이와 같은 일을 하려고 합니까?

static GraphicsItem<T>[] CreateArrays<T>()
{
    GraphicsItem<T>[] _foo = new GraphicsItem<T>[1];

    // This can't work, because you don't know if T == typeof(string)
    // _foo[0] = (GraphicsItem<T>)new GraphicsItem<string>();

    // You can only create an array of the scoped type parameter T
    _foo[0] = new GraphicsItem<T>();

    List<GraphicsItem<T>> _bar = new List<GraphicsItem<T>>();

    // Again same reason as above
    // _bar.Add(new GraphicsItem<string>());

    // This works
    _bar.Add(new GraphicsItem<T>());

    return _bar.ToArray();
}

제네릭 유형의 배열을 생성하려면 제네릭 유형 참조가 필요하다는 점을 기억하세요.이는 메서드 수준(메서드 뒤에 T 사용) 또는 클래스 수준(클래스 뒤에 T 사용)일 수 있습니다.

메서드가 GraphicsItem 및 GraphicsItem의 배열을 반환하도록 하려면 GraphicsItem이 제네릭이 아닌 기본 클래스 GraphicsItem에서 상속하고 그 배열을 반환하도록 합니다.하지만 모든 유형 안전성을 잃게 됩니다.

도움이 되길 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top