2014-02-13 2 views
1

다음 상황을 고려?호출 파생 클래스 방법은

InvokeX(IParametr @param){ 
    ((dynamic) this).X((dynamic) @param); 
} 

하지만 난 더 빠른 솔루션을 찾고 있어요 :

가 나는 같은 것을 할 수 있다는 것을 알고 (InvokeX가 파생 클래스에있을 때, 추상적에 대한 슈어하지 확인). 어떤 식 으로든 System.Runtime.CompilerServices 네임 스페이스를 사용할 수 있습니까? 특히 CallSite Class?

감사합니다.

답변

2

Expression Problem의 인스턴스가 있으며, 오늘날 대부분의 프로그래밍 언어에서 일반적인 확장 성 문제가 있습니다. 반사 또는 동적 호출은 그 주위에있는 방법이지만 특정 경로 아래로 코드를 실행할 때까지 이름 지정이나 매개 변수 유형에 실수를 알지 않으므로 버그가 발생하기 쉽습니다.

더 많은 유형 (더 많은 구현 IParametr)과 더 많은 연산 (이 경우 더 많은 매개 변수 유형을 사용하는 메소드)을 지원하도록 애플리케이션을 확장하려고합니다.

그래서 기본적으로 유형 및 조작의 매트릭스가 표시됩니다. 예 :

Type  Derived  Derived2 ... 
ParamX  x   x 
ParamY     x 
... 

Xes는 작업 (행)의 유형 (열)에서 구현해야하는 것을 나타냅니다.

구현 유형을 안전하게 유지하려면 Visitor 또는 Interpreter 패턴을 사용해야합니다. 각각에는 단점이 있습니다. double dispatch 활용

방문자 패턴 :

public class Derived : Base { 
    public override void X(ParamX x) { } 
    public override void X(ParamY a) { } 
} 

public abstract class Base : IXVisitor 
{ 
    public void Visit(IParametr parameter) 
    { 
     parameter.Accept(this); 
    } 
    public abstract void X(ParamX x); 
    public abstract void X(ParamY a); 
} 

public interface IXVisitor 
{ 
    void X(ParamX a); 
    void X(ParamY a); 
} 

public interface IParametr 
{ 
    void Accept(IXVisitor visitor); 
} 

public class ParamX : IParametr 
{ 
    public void Accept(IXVisitor visitor) 
    { 
     visitor.X(this); 
    } 
} 

public class ParamY : IParametr 
{ 
    public void Accept(IXVisitor visitor) 
    { 
     visitor.X(this); 
    } 
} 

당신이 얻을하려는 경우 정말 당신이 시도 할 수 하드 코어 Object Algebras

관련 문제