문제

C# 3.0 확장 메소드 기본 유형에 확장 기능을 추가하여 해당 메소드를 모두 호출합니다. 인스턴스 그러한 유형의 법적.

이제 JavaScript I Know는 특정 인스턴스에 메소드를 추가 할 수있는 idispatchex를 구현합니다.

그렇다면 C# 클래스의 '인스턴스'에 메소드 세트를 추가하려면 어떻게해야합니까? 나는 이것이 역동적 인 대 정적 언어 성 전쟁 영토라는 것을 알고 있습니다. :) 내 의도가 그렇게 아니라고 명확히하겠습니다.

해당 인터페이스를 구현하는 클래스에 따라 인터페이스에 일련의 이벤트를 추가 할 수 있기를 원합니다.

나는 제네릭을 사용하여 그렇게 할 수있었습니다

inteface ISample<T> { T SupportedEvents; }  

class Sample : ISample<UIWidgetEvent>   {   }  
class Sample2 : ISample<NonVisualUIWidget> { }

class UIWidgetEvent { public EventHandler Clicked; }  
class NonVisualUIWidget {public EventHandler Expired;}

class TestSample
{  
    public void Test()
    {  
        new Sample().SupportedEvents.Clicked += ...
        new Sample2().SupportedEvents.Expired += ...
    }  
}  

그럼 나는 마음에 들지 않았다 SupportedEvents 나는 말할 수 있기를 원한다

new Sample().Clicked +=...

그런 다음 JavaScript를 생각했습니다 (알고 있습니다 C# 아니다 JS :))... 그리고 IDispatchEx, IL Weaving, Reflection.Emit 등.

예, 아마도 방문자 패턴 으로이 "인스턴스 증강"을 할 수 있습니다. [구문 설탕을 얻을 수 있는지 확실하지 않음

코멘트?

도움이 되었습니까?

해결책

글쎄, 당신은 당신의 "새로운"메소드에 대한 동적 메드 인스턴스를 만들 수 있지만, 런타임에 기존 인스턴스에 통계적으로 첨부하는 것은 그것이 컴파일되지 않기 때문에 작동하지 않습니다.

~할 것 같다 (나는 이것을 시도하지 않았다) opcodes를 메모리 내 어셈블리로 방출 할 수는 있지만, 그것은 당신이 얻을 수있는 것처럼 "구문 적으로 달콤한"것과는 거리가 멀다 (많은 반성과 요구를 불러 일으킬 것입니다. 생각한다)

확장 방법을 조사 할 가치가있을 수 있습니다. 확장 방법을 통해 이벤트 나 이벤트와 같은 방법을 첨부하려고 시도한 적이 없지만 3.5 만 있으므로 제한 할 수 있습니다.

가장 멋진 외관 인 "Pure C#"구현은 아마도 일반/인터페이스 설정으로 이미 얻은 것과 매우 유사 할 것입니다 ...

솔직히 말해서, 이와 같은 진정한 "동적 지원"을 가진 무언가를 찾고 있다면, 나는 DLR 가능성 언어 (Ironpython과 같은)로 이런 종류의 일을하고 C# 물건에서 전화 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top