문제

내가 의미하지 않는 동적 주의 의미에서 주 낮은 인터페이스 또는 기본 클래스를 더 파생 클래스 I mean 인 인터페이스를 정의하는 나를 만들었고,동적으로 주조하는 인터페이스는 다른 개체로부터 유래하지 않는 인터페이스를 지원하지만 모든 호출합니다.

예를 들어,

interface IMyInterface
{
   bool Visible
   {
      get;
   }
}

TextBox myTextBox = new TextBox();
IMyInterface i = (dynamic<IMyInterface>)myTextBox;

이 될 수 있을 달성에서 컴파일한 시간에 대한 알려져 종류 및 런타임에 대한 인스턴스를 선언한 동적입니다.인터페이스를 정의 알려져 있으로,은 유형(예에서)도록 컴파일러 결정할 수 있는 경우 객체를 지원하는 통화에 의해 정의된 인터페이스를 수행에 대한 마법을 가지고 우리에게 캐스팅.

내 생각이에서 지원되지 않습 C#4(수가 없었을 찾아 그것을 참조하)지만,나는 알고 싶은 확실합니다.고 올바르게 작동하지 않는 경우에 대해 의견을 나누는 경우 포함되어야에서 향후 변종의 언어 또는지,그 이유와 한다.나를 위해,그것은 것 같아 좋은 추가 사용하는 큰 다형성에 코드를 만들 필요없이 새로운 유형 감싸는 기존 프레임워크 형식입니다.

업데이트
지 않도록 누군가가 나에게 비난의 표절,모르고 있었의 존 스키트 데 이미 제안이.그러나,좋을 알고 우리의 생각은 대단히 유사한 구문을 제안하는 그것이 될 수 있는 직관적이 적어도 있습니다.한편,"독창적 인 아이디어를 가지고 있는"나는 또 다른 일입니다.

도움이 되었습니까?

해결책

Jon Skeet은 그러한 제안을했다고 생각합니다.http://msmvps.com/blogs/jon_skeet/archive/2008/10/30/c-0-dynamic-lt-t-gt.aspx), 그러나 지금까지 나는 C# 4.0에 그것을 가질 것이라고 듣지 못했습니다.

다른 팁

나는 그것이 문제가된다고 생각합니다. 결합되지 않은 두 클래스 사이에 커플 링을 도입합니다.

다음 코드를 고려하십시오.

public interface IFoo
{
   int MethodA();
   int MethodB();
}

public class Bar
{
   int MethodA();
   int MethodB();
}

public class SomeClass
{
   int MethodFoo(IFoo someFoo);
}

그러면 합법적이어야합니까?

int blah = someClass.MethodFoo((dynamic<IFoo>)bar);

그것 보인다 컴파일러가 IFOO를 구현하는 것으로 동적으로 막대를 입력 할 수 있기 때문에 합법적이어야합니다.

그러나이 시점에서 코드의 완전히 별도의 부분에서 통화를 통해 ifoo 및 bar를 연결하고 있습니다.

막대와 ifoo가 관련이 없더라도 더 이상 methodb가 필요하지 않기 때문에 막대를 편집하는 경우 갑자기 someclass.methodfood가 더 이상 작동하지 않습니다.

마찬가지로, ifoo와 bar가 표면적으로 관련되지 않더라도 Methodc ()를 ifoo에 추가하면 코드가 다시 중단됩니다.

사실, 이것은 당신이 제어하지 않는 객체들 사이에 유사성이있는 선택된 경우에 유용하지만 인터페이스를 객체에 명시 적으로 첨부 해야하는 이유가 있으며, 그 이유는 컴파일러가 객체가 그것을 구현합니다.

가 필요 없 C#이를 지원하기 위해 그대로 구현할 수 있는 아주 깔끔하게로 라이브러리입니다.

본 세 개 또는 네 개의 별도 구현(을 쓰기 시작 중 하나는 나 자신을 발견하기 전에 내가 그들에게).여기에는 가장 철저한 처리를 보았:

http://bartdesmet.net/blogs/bart/archive/2008/11/10/introducing-the-c-ducktaper-bridging-the-dynamic-world-with-the-static-world.aspx

그것은 아마도를 쉽게 구현되면 DLR 에 통합합니다.

기 때문에 래퍼/운송업자 등에 대한 주어진 인터페이스를 생성할 수 있습면 다음 캐시되고 그 지정된 객체를 알 수 없는 유형의 포장 될 수 있다면,많은 범위에 대한 캐싱의 호출 사이트,등등.그래서 성능 우수 해야 합니다.

반면에,나는 생각하 dynamic 키워드하는 언어 기능,그리고 큰 복잡한 하나,불필요한과 잠재적으로 비참한 여담,구두 발 언어로 이전에 매우 명확한 정적 타 철학이었는데,그것은 분명한 방향으로 미래의 개선을위한.그들이 붙어 있는 것과 형식추는 일이 더 나을 때까지 입력가되었다 더 많은 보이지 않습니다.그래서 많은 지역들은 진화의 언어 파괴하지 않고,기존 프로그램을,그럼에도 불구하고 그들지 않는 단순히으로 인해 리소스 조건(예:는 이유 var 에 사용할 수 없다는 더 많은 장소이기 때문에 그들은 다시 컴파일러 및 그들은 시간이 없).

그들은 여전히 하기 좋은 물건에서는 C#4.0(분산능)그러나 너무 많은 다른 사람이 될 수 있는 과제 해결을 위해서는 이 형식 시스템 더 똑똑하다,자동,더 강력을 검출하기에 문제를 컴파일때 정해진다.대신에,우리는 본질적으로 얻는 비밀입니다.

OpenSource 프레임 워크 즉석-인터페이스 C# 4와 DLR을 사용하여이를 수행합니다.

using ImpromptuInterface;

interface IMyInterface
{
   bool Visible
   {
      get;
   }
}

TextBox myTextBox = new TextBox();
IMyInterface i = myTextBox.ActLike<IMyInterface>();

DLR을 사용하므로 ExpandooBject 및 DynamicObject에서도 작동합니다.

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