2013-09-06 2 views
0

인라인 인터페이스를 구현하는 클래스를 만드는 간단한 방법이 있는지 궁금합니다. 익명 메소드가 있지만 인터페이스를 구현하는 것과 같습니다.인터페이스를 구현하는 익명 클래스 만들기

문제는 :

interface iSomeInterface 
{ 
    void DoIt(); 
} 

public void myMethod(iSomeInterface param) 
{ 
... 
} 

그리고 나는이처럼 사용하고 싶습니다 :

object.myMethod(new { override DoIt() { Console.WriteLine("yay"); } } : iSomeInterface); 

어떤 아이디어?

죄송합니다.

+1

달성하고자하는 것은 무엇입니까? – Ehsan

+0

나는 당신이 보는 것을 성취하려고 노력하고 있습니다. 익명 유형과 동일합니다. 어쨌든 코드에서 한 번만 필요로하는 추가 클래스를 작성하지 않아도됩니다. –

+1

'Func '및'액션 '과 그 변형은 비슷한 것을 얻기에 유용 할 수 있습니다 ... – VS1

답변

3

죄송 합니다만 C#의 클래스를 인라인으로 구현할 수 없습니다. Anonymous Types 만 있지만 인터페이스 추가 (예 : Can a C# anonymous class implement an interface? 참조)를 지원하지 않으며 메소드 또는 필드 추가를 지원하지 않으며 속성 만 지원합니다.

System.Reflection.Emit의 메서드를 사용하여 런타임에 클래스를 생성 할 수 있지만 길고 지루합니다.

+0

이것을 달성하는 까다로운 트릭이 있습니까? –

+0

@ninjahedgehog 닌자와 같은 까다로운 트릭이 아닙니다. 기술적으로 당신은 Reflection을 통해 새로운 클래스를 만들 수 있습니다.하지만 그것은 대단히 효과적입니다. 예를 들어보십시오 http://stackoverflow.com/questions/15733900/dynamically-creating-a-proxy-class – xanatos

+0

@ninjahedgehog 단일 메서드 인터페이스 (귀하의 경우 하나의'void' 메서드)를 받아들이려면 대신 '행동'. –

0

자바에서는 꽤 흔한 일이지만 C#에서는 할 수있는 방법이 없습니다. 당신은 비록 매개 변수로 함수 나 절차를 전달할 수 있습니다 (매개 변수와 반환 값 기능)

public void myMethod(Action act) 
{ 
    act(); 
} 

myMethod(() => Console.WriteLine("yay")); 

몇 가지 (일반) 액션 버전 (프로 시저 매개 변수없이 반환 값) 및 Func을 존재한다.

object.myMethod(new SomeAction(() => Console.WriteLine("yay")); 

이것은 물론 당신이 경우 매우 실용적입니다 :

public sealed class SomeAction : ISomeInterface 
{ 
    Action action; 
    public SomeAction (Action action) { this.action = action; } 
    public void DoIt() { this.action(); } 
} 

이 다음과 같이 당신이 그것을 사용할 수 있습니다 :

1

당신은 그 인터페이스를 Action를 래핑하고 구현하는 클래스를 만들 수 있습니다 SomeAction을 재사용 할 예정이지만이 방법이 가장 편리한 방법 일 것입니다.

+0

그래, 이거 멋지게 보입니다. –

관련 문제