2013-06-03 2 views
2

이것이 가능한지 궁금한 점은이 클래스의 인스턴스를 만들 때 목록 유형을 설정하고 싶습니다.동적으로 형식화 된 목록

class MyClass 
{ 
    private Type _type = typeof(string); 
    public MyClass(Type type) 
    { 
     this._type = type; 
    } 

    public List<_type> MyList { get; set; } <----it does not like this 
} 
+1

가장 쉬운 해결책은 클래스가 일반적인 있도록하는 것입니다 ... –

답변

8

제네릭 형식 정의 사용

class MyClass 
{ 
    private Type _type = typeof(string); 
    public MyClass(Type type) 
    { 
     this._type = typeof(type); 
     this.MyList = Activator.CreateInstance(typeof(List<>).MakeGenericType(type)); 
    } 

    public IList MyList { get; set; } <----it likes this 
} 

: 당신이이 Type 인수에 전달 제네릭 당신이 뭔가를 할 수 있습니다 작동하지 않습니다 동의해야하는 경우

class MyClass<T> 
{ 
    private Type _type = typeof(string); 
    public MyClass() 
    { 
     this._type = typeof(T); 
    } 

    public List<T> MyList { get; set; } <----it likes this 
} 

을 장점은 목록에 유형 제약 조건을 적용한다는 것입니다. 지정된 유형의 항목 만 목록에 추가 할 수 있습니다. 단점은 당신이 얻는 모든 아이템을 던져야한다는 것입니다. 이런 일을 피하고 위의 일반적인 예를 사용하면 더 좋을 것입니다. 세 번째 옵션은 제네릭을 완전히 삭제하는 것입니다.

class MyClass 
{ 
    private Type _type = typeof(string); 
    public MyClass(Type type) 
    { 
     this._type = typeof(type); 
     this.MyList = new ArrayList(); 
    } 

    public IList MyList { get; set; } <----it likes this 
} 

이것은 유형 적용을 제공하지 않습니다. 귀하의 마일리지가 다를 수 있습니다. 제네릭

+1

Ninja'ed 4 초, bu 당신의 대답은 더 아름답고 완벽합니다. – Renan

+0

이렇게 주어진다면'Type' 객체가 주어 졌을 때 어떻게'MyClass' 인스턴스를 생성할까요? 이것은 단지 문제를 지연시키는 것입니다. 대답은 OP가 실제로 그렇게 할 필요가 없다고 가정하는 것 같습니다. 그것은 사실 일 수도 있고 아닐 수도 있습니다. 우리는 정말로 알 수 없습니다. – Servy

+0

@Servy 예를 들어'MyClass foo = new Myclass ()'과 같은 작업을 할 수 있습니다. 원하는 타입으로'int'를 대체하십시오. – Renan

6
class MyClass <T> 
{ 
    public List<T> MyList { get; set; } 
} 
+2

이것은 내 문제를 해결 한 것입니다. 감사합니다. –

1
class MyClass<T> 
{ 
    public MyClass() 
    { 
     MyList = new List<T>(); 
    } 

    public List<T> MyList { get; set; } 
} 

및 사용 :

MyClass<string> x = new MyClass<string>(); 
x.MyList.Add("asdf"); 
관련 문제