2012-09-25 2 views
24

메서드에 제네릭 형식 변환기 함수를 보내고 싶지만 어떻게 처리해야하는지 알 수 없습니다.generic 형식 매개 변수로 func을 전달할 수 있습니까?

public void SomeUtility(Func<T><object,T> converter) 
{ 
    var myType = converter<MyType>("foo"); 
} 

편집 (코멘트도 내 설명을 참조하십시오 :

는 여기에 내가, 문제는 내 FUNC와 함께 제네릭 형식을 지정하는 방법을 몰라 달성하기 위해 무엇을 좋아 설명 유효하지 않은 구문입니다 로렌스)와 함께 "일반적인 형식 변환기"으로 나는 내 방식의 다음 라인이 될 수 있도록, 어떤 강력한 유형 <T> (반대하지)로 변환 할 수있는 변환기를 전달하고자하는 의미 :

var myOtherType = converter<MyOtherType>("foo"); 

내가 좋아하는 대표단 매개 변수 이런 식으로 뭔가 보일 것 같은 엉덩이 :

private delegate TOutput myConverterDelegate<TOutput>(object objectToConvert); 

이 더를 구문/C 번호 탐사 지금, 나는 아마 대신 인터페이스를 사용하는 일을 얻을 수 있지만, 나는 이것이으로 수행 할 수 있습니다 희망해야 할 일 func/delegate.

+0

메서드 본문 내부에 형식을 중요하게 지정 했습니까? 이 메서드는 호출자가 정의한 특정 형식이 아닌 여러 형식에 대한 변환이 필요할 수 있음을 암시하고 있습니까? –

+0

예, "generic type converter"로 표현하려고 했으므로 다음 줄이 var 일 수 있습니다. myOtherType = converter ("foo"); – joeriks

+0

알았어 - 그럼 내 대답이 유용하다고 생각할거야 :) –

답변

19

당신은 일반적인 기능이나 행동의 인스턴스 수 없습니다 - 모든 유형 매개 변수는 선행 정의되고 통화에서 재정의 할 수 없습니다.

쉬운 방법은 아래로 캐스팅에 의존하여 모두 다형성을 방지하는 것입니다 : 당신이 안전을 입력합니다

public void SomeUtility(Func<Type, object, object> converter) 
{ 
    var myType = (MyType)converter(typeof(MyType), "foo"); 
} 

, 당신은 호출자에게 형식 매개 변수의 정의를 연기해야합니다.

public void SomeUtility(IConverter converter) 
{ 
    var myType = converter.Convert<MyType>("foo"); 
} 

interface IConverter 
{ 
    T Convert<T>(object obj); 
} 

편집 :

'변환 유형이'콜 현장에서 알고있는 경우

, 및 이러한 유형의 내부에 사용됩니다 당신은 인터페이스 내에서 일반적인 방법을 구성하여이 작업을 수행 할 수 있습니다 유틸리티 메서드를 사용하면 메서드에 제네릭 형식을 정의하고 다른 포스터와 마찬가지로 사용할 수 있습니다.

+0

그래, 고마워, 네, 아마 인터페이스를 써서 그 방향으로 나를 가르쳐 주셔서 고맙습니다. 그러나, 관심사에서, 대표자 또는 기능은 일반적인 유형을 전달할 수 있어야하지 않습니까? 델리게이트로 설명하면 다음과 같이 작성합니다. private delegate TOutput myConverterDelegate (object objectConvert); -하지만 매개 변수로 사용하려고하면 "1 개의 형식 인수가 필요합니다." – joeriks

+1

결국 일반 위임자를 * 정의 할 수 있습니다. 결국 Func 및 Action의 정의와 같습니다. 일반 인터페이스 및 클래스처럼 일반 정의 *로 처리됩니다. 그러나 메서드 시그니처에는 * generic 정의 *를 사용할 수없고 매개 변수화 된 * generic 형식 * 만 사용할 수 있습니다. 대 신자만으로는 성취하려는 것을 할 수 없습니다. –

7

SomeUtility도 일반으로 설정해야합니다. 이렇게하고 구문을 고정하는 것은 제공 : 다음

public void SomeUtility<T>(Func<object,T> converter) 
{ 
    var myType = converter("foo"); 
} 
15
public void SomeUtility<T>(Func<object, T> converter) 
{ 
    var myType = converter("foo"); 
} 

과 :

SomeUtility(arg => new MyType()); 

일반적인 형식 유추는이 경우에 작동합니다.

+0

이걸 받아 들여야 만한다. –

3

컴파일 타임에 T 타입을 알고 있어야 사용할 수 있습니다. T는 클래스 수준 또는 메서드 수준에서 지정할 수 있습니다.

class SomeClass<T> { 
    public void SomeUtility(Func<object, T> converter) { 
     var myType = converter("foo"); // Already is the T-type that you specified. 
    } 
} 

또는

public void SomeUtility<T>(Func<object, T> converter) { 
    var myType = converter("foo"); // Already is the T-type that you specified. 
} 
관련 문제