런타임에 Reflection.Emit
을 사용하여 유형을 구축 중입니다. 최종 사용자는 기본 유형과 새로운 유형이 지원해야하는 인터페이스를 제공합니다. 인터페이스에 기본 유형이 지원할 수없는 멤버가있는 경우 정적 필드에 저장된 대리자를 호출하는 스텁 메서드를 만듭니다 (참조 또는 매개 변수없이 15 개 이하의 매개 변수를 사용하는 비 제너릭 메서드 만 지원합니다. 이 제한 사항으로 문제를 제기하지 마십시오. 대리자는 사용자가 형식을 만들기 전에 제공 할 수있는 baseType의 첫 번째 매개 변수를 사용합니다.유형이 인터페이스를 지원할 수있는 최선의 방법은 무엇입니까? (Duck-Typing)
그러나 형식으로 만족할 수있는 인터페이스 멤버에 대한 대리자 스텁을 만드는 것을 피하고 싶습니다. 예 : 난 당신이 내 빌더 여기 new[]{typeof(IDuck)}
와 Goose
에 보낸 경우, 나는 거위로 void Quack()
에 대한 스텁을 생성하지 않습니다 싶습니다
public class Goose
{
public void Quack()
{
// quack implementation details go here.
}
}
public interface IDuck
{
void Quack()
}
인터페이스를 만족시킨다.
Goose가 IDuck을 구현하지 않아서 인터페이스 매핑이 작동하지 않아서 TypeBuilder
이 생성해야하는 유형에서 인터페이스 매핑을 위해 새로 빌드 된 유형을 요청할 수 없습니다.
어떻게 원격으로 효율적으로 해결할 수 있습니까? 공개적으로 표시되는 멤버 만 조사해야하며 동일한 유형의 인터페이스를 명시 적으로 구현하는 유형은 대상으로 사용해서는 안된다고 생각할 수 있습니다. (예 : 거위가 void IGoose.Quack()
으로 구현 된 경우 void IDuck.Quack()
의 대상으로 간주해서는 안 됨). (어쨌든 BindingFlags.Public | BindingFlags.Instance
은 이러한 요소를 필터링하는 데 충분해야합니다.)
[Duck Typing Project] (http://www.deftflux.net/blog/page/Duck-Typing-Project.aspx)를 사용해 보았습니까? – cdhowie
이것은 재미있는 접근법입니다. 형식을 바꿔야 할 때 정확하게 일치시켜야합니다. –