2011-12-26 2 views
2

메서드 표시를 허용하는 유창한 스타일의 API를 만들려고합니다. 내가 달성하고자하는 것은이 (잘못된) 코드 샘플로 설명한 기능 할 수 있습니다메서드 그룹을 허용하는 유창한 API 메서드 만들기

public class SampleBuilder 
{ 
    public void Method<T>(Expression<Func<T, Delegate>> func) { } 
    // for the sake of this example this method doesn't have a return value 
} 

public class Sample 
{ 
    public void SomeMethod(int some, int arbitrary, int agruments) { } 
} 

public class SampleConfig 
{ 
    public void Config() 
    { 
     new SampleBuilder().Method<Sample>(x => x.SomeMethod); 
    } 
} 

문제는 분명히 컴파일러 x.SomeMethod이 방법 그룹을 의미 불평. 내 API는 실제 인스턴스 또는 실제 메소드 서명을 추정 할 수 없습니다. 이것은 런타임에 결정됩니다.

사용자가 방법 그룹을 지정할 수있게 해주는 사용하기 쉬운 API를 제공하려면 어떻게해야할까요?


배경 : 결과 사용은 다음과 같이 될 것입니다 :

config.Transition().From(v1def, v1 => v1.ExitMethod).To(v2def, v2 => v2.EntryMethod); 

경우 To()From()전망항목/종료 방법의 정의에 동의합니다. 위의 특정 샘플에서 v1def은 뷰 정의 클래스를 나타내며 v1은 실제 뷰 클래스를 나타냅니다. 마지막 날에 새로운 전환이 생성되고 config에 추가됩니다. 방법의

답변

1

아쉽게도 메소드 그룹을 매개 변수로 전달하는 방법은 없습니다. 내가 아는 한, CLR (다양한 언어와 그 사이의 모든 것)은 본질적으로 형식이없는 대리자가 될 수있는 것을 지나칠 수 없으며 ... 메서드 오버로드로 인해 다른 서명이있는 여러 대리자의 시나리오가 메소드 그룹 이름으로 대표되는 요소를 고려해야합니다.

보기 정의 및보기 인스턴스 클래스가 구조화되거나 구현 된 방법에 대한 세부적인 내용이 없기 때문에 AOP을 사용하여 attributes을 사용하는 것이 가장 좋습니다. 만약 당신의 아키텍처에 적용 할 수 있다면, 나는 그것을 고려해 볼 것을 강력히 제안 할 것이다. 사용자 정의 속성으로 입력 W 종료 메소드를 꾸밀 수 있으며 구성 클래스에서 데코 레이션을 사용할 수 있습니다.

아키텍처가 AOP로 확장 될 수없는 경우 구성을 작성할 때 문자열을 사용하는 약한 유형의 솔루션으로 이동하고 해당 문자열을 읽을 때 상당한 양의 반영을 수행해야합니다 뒤로. 나는 .NET의 다른 유창한 API와 비슷하지 않다고 생각하지만 실제로 그렇게 나쁘다.

config.Transition().From(v1def, "ExitMethod").To(v2def, "EntryMethod"); 
0

하나는 전달하여 (샘플 클래스

public void SomeMethod() { } 

를 추가하고,

public void Method<T>(Expression<Func<T, Action>> func) { } 

당신이 필요한 방법의 이름을 캡처 할 수 있습니다이 방법에 SampleBuilder.Method 서명을 변경하는 것입니다 대리인 인스턴스로 변환되는 메서드 그룹)을 선택하고 적절한 오버로드를 선택합니다.

관련 문제