2011-04-11 5 views
0

나는 불가능을 달성하려고 노력하고 있습니까? 아니면 단순히 불필요한가요? GetList의 코드는 전문화의 새 인스턴스를 만드는 비트를 제외하고 클래스 A의 모든 전문화에 대해 동일합니다. 기본 생성자는 없으며 항상 동일한 매개 변수 목록이 있습니다. 순간이 변형은 C# Generics에서 가능합니까?

내가 사용하고 대신 public static List<A> GetList(int i, Func<A> createMeAnInstance)

더러운 느낌이있다.

abstract class A 
{ 
    protected A (int i) 
    { 

    } 

    public static List<T> GetList<T>(int i) where T : A 
    { 
    var list = new List<T>(); 
    for(int x = 1; x< 100; x++) 
    { 
    var o = new T(i); 
    list.Add(o); 
    } 
    } 
} 

public class B : A 
{ 
    public B (int i) : base(i) {} 
} 

... 

var list = A.GetList<B>(1); 

답변

2

제네릭 형식에서는 매개 변수화 된 생성자를 호출 할 수 없습니다. Func <> 버전이 최선의 방법입니다.

0

당신은 그렇게 할 수 없습니다. 생성자에 대한 유형 제약 조건으로 new() 만 지정할 수 있습니다.

B 인스턴스를 GetList에 직접 가져 가지 마십시오.

List<B> list = A.GetList(new B(i)); 

사용이 코드 :

내가 제대로 이해하면
public static List<T> GetList<T>(T o) where T : A 
{ 
    var list = new List<T>(); 
    list.Add(o); 
    return list; 
} 
+0

은 내가 많은 인스턴스를 만들 때 Func가되어야합니다. –

+0

이유를 설명 할 수 있습니까? –

3

교환 원 newActivator.CreateInstance으로 컴파일됩니다.

그냥

Activator.CreateInstance로 (대해서 typeof (T), 새로운 객체 [] {난})

완벽한 있지만 작동하지 물품.

+1

아니요,'Activator.CreateInstance'에 대한 호출로 컴파일되지 않습니다 – Dyppl

+0

:) shure 있습니까? – gandjustas

+0

http://stackoverflow.com/questions/367577/why-does-the-c-compiler-emit-activator-createinstance-when-calling-new-in-with-a – gandjustas

0

기본 생성자를 사용하고 기본 클래스 (A)를 필드로 이동하는 것이 더 좋습니다. 그러나 어떤 상황에서는 리플렉션을 사용하는 것이 더 적절할 수 있습니다.

관련 문제