2012-10-16 4 views
3

좀 수집 핸들러를 지정하는 인터페이스가 상상 :C#에서 일반적인 방식으로 제네릭 처리기를 표현할 수있는 방법이 있습니까?

interface ICollectionHandler<T> where T : new() { ... } 

그때는 여러 유형에 사용할 모음 핸들러를 원하는 같은 다른 클래스가, 그래서 뭔가하고 싶은 :

class SomeClass<T> where T : ICollectionHandler<> ... 

이렇게하면 "유형 인수가 누락되었습니다."라는 오류가 발생합니다.

그래서 T가 제네릭 형식인지, 런타임에 자체 형식 인수를 지정할 수 있는지 또는 여기에 (아마도 합리적인) 경계를 넘어서는 C#을 지정하는 방법이 있습니까?

답변

3

ICollectionHandler<T>에 대한 기본 인터페이스를 생성하고 제한 할 수 있습니다.

interface ICollectionHandler { ... } 
interface ICollectionHandler<T> : ICollectionHandler where T : new() { ... } 
class SomeClass<T> where T : ICollectionHandler { ... } 

또는 ICollectionHandler<T> 제약에 전달되어야하는 유형 나타내는 SomeClass에 매개 변수를 추가

class SomeClass<T, U> where T : ICollectionHandler<U> { ... } 
+0

2 년이 걸렸지 만이 질문으로 돌아와서 읽었을 때 "나는 SomeClass가 필요했습니다. "이라고 생각했습니다. 2 년 전, 늦은 정답을 가지고 있다고 나에게 말했어! :) –

2

당신은 SomeClass에 두 번째 유형 매개 변수를 추가 할 수 있습니다

class SomeClass<T, U> where T : ICollectionHandler<U> ... 
+0

그러면 SomeClass의 인스턴스를 생성 할 때 U를 지정해야하고 (b) 프로세스에서 T가 T 이되도록 제한해야하므로 필자는 나를 위해 작동하지 않을 것이라고 생각합니다. 아니면 내가 너를 오해 했니? –

+0

예, 두 유형을 모두 지정해야합니다. – kevingessner

5

당신을 다음과 같이 시도 할 수 있습니다.

interface ICollectionHandler<T> where T : new() { } 

public class MyImplementation<T, U> where T : ICollectionHandler<U> { } 

인터페이스의 구현 내에서 어떤 제네릭 유형이 있는지 알고 있어야합니다. 해당 하위 유형에 대해 신경 쓰지 않는 경우 :

interface ICollectionHandler { } 

public abstract class CollectionHandler<T> : ICollectionHandler where T : new() { } 

public class MyImplementation<T> where T : ICollectionHandler { } 

하지만 실제로 어떤 용도로 사용하는지에 따라 다릅니다. 더 자세한 정보를 제공 할 수 있습니까?

관련 문제