2010-07-29 5 views
15

new() 생성자 제약 조건을 사용하여 특정 형식의 생성자가있는 클래스를 요구하는 일반 메서드를 만드는 방법이 있습니까? 예를 들어C# 제네릭 메서드, new() 생성자 제약 조건 매개 변수

:

나는 다음과 같은 코드가 있습니다

public T MyGenericMethod<T>(MyClass c) where T : class 
{ 
    if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null) 
    { 
     throw new ArgumentException("Invalid class supplied"); 
    } 
    // ... 
} 

그것이 가능이 대신 같은 것을 가지고? 이에 대해있다 a suggestion :

public T MyGenericMethod<T>(MyClass c) where T : new(MyClass) 
{ 
    // ... 
} 

편집

. C#에서이 기능을 사용할 수 있도록 투표하십시오!

+1

조금 혼란 스럽습니다. 정확히 당신이 성취하려고하는 것은 무엇입니까? 생성자가 MyClass 매개 변수를 가져 오나요, 아니면 T를 MyClass로 제한합니까? –

답변

28

아니요. C#은 no-args 생성자 제약 조건 만 지원합니다. 호출 할 때 다음

public T MyGenericMethod<T>(MyClass c, Func<MyClass, T> ctor) { 
    // ... 
    T newTObj = ctor(c); 
    // ... 
} 

:

MyClass c = new MyClass(); 
MyGenericMethod<OtherClass>(c, co => new OtherClass(co)); 
4

번호는 불행하게도, 일반적인 제약 조건 만 포함 할 수

나는 일반적인 인수 생성자에 사용하는 해결 방법은 대리자로 생성자를 지정하는 것입니다 :

where T : new() 

이는 매개 변수가없는 기본 매개 변수가 있음을 지정합니다. 구조자. 특정 매개 변수 유형을 허용하는 생성자가있는 유형을 제한 할 방법이 없습니다.

자세한 내용은 Constraints on Type Parameters을 참조하십시오.

+0

그래, 나는 그 기사를 읽었지만, new() 제약에 대해서는 그다지 구체적이지 않았다. 어쨌든 고맙겠습니다. 유효성 검사 장소를 그대로 두겠습니다. – Meryovi

+0

@Joel : 그들이 표시하는 옵션은 new() 제약 조건의 유일한 옵션입니다. 매개 변수를 추가 할 방법이 없습니다. –

2

아니요, C#에서는 제네릭 형식이 특정 서명의 생성자를 갖도록 제한 할 수 없습니다. new()는 매개 변수없는 생성자 만 지원합니다.

+1

그래도 좋은 추가 것입니다! – Meryovi

관련 문제