programing

C # 4 : 동적 형식의 실제 예

nasanasas 2020. 11. 25. 08:00
반응형

C # 4 : 동적 형식의 실제 예


저는 제 두뇌가 C # 4의 Dynamic Types 개념을 반쯤 감싸고 있다고 생각하지만 실제로 사용하고 싶은 시나리오를 제 인생에서 알아낼 수는 없습니다.

나는 많은 것이 있다고 확신하지만 인터페이스, 의존성 주입 등이 아닌 역학으로 더 잘 해결되는 솔루션을 어떻게 엔지니어링 할 수 있는지 연결하는 데 어려움을 겪고 있습니다.

그렇다면 동적 유형 사용이 적절한 실제 애플리케이션 시나리오는 무엇입니까?


오늘날 이미 동적 타이핑과 동적 바인딩을 사용하고 있는 경우가 많이 있습니다 . System.ObjectC # 4까지는 필요한 지원이 없었기 때문에 문자열 또는. 뒤에 모두 숨겨져 있기 때문에 깨닫지 못합니다.

한 가지 예는 COM interop입니다. COM은 실제로 반동적 개체 시스템입니다. COM interop을 수행 할 때 실제로 많은 메서드가 동적 개체를 반환하지만 C #이이를 지원하지 않았기 때문에 이러한 개체가 반환 System.Object되고 사용자가 직접 캐스팅해야하므로 도중에 예외를 포착 할 수 있습니다.

또 다른 예는 JSON, CSV, HTML, 스키마없는 XML, 스키마없는 웹 서비스, 스키마없는 데이터베이스 (결국 새로운 인기)와 같이 동적으로 형식이 지정된 (또는 형식이 지정되지 않은) 데이터와 상호 작용하는 것입니다. 오늘날에는이를 위해 문자열을 사용합니다. XML API는 다음과 같습니다.

var doc = new XmlDocument("/path/to/file.xml");
var baz = doc.GetElement("foo").GetElement("qux");

등등. 하지만 어떨까요?

dynamic doc = new XmlDocument("/path/to/file.xml");
var baz = doc.foo.qux;

멋지지 않나요?

세 번째 예는 반사입니다. 오늘날 리플렉션을 통한 메서드 호출은 문자열을 InvokeMember(또는 어떤 것이 호출 되든) 전달하여 수행됩니다 . 그냥 그 빌어 먹을 일을 불러내는 게 더 좋지 않을까요?

그런 다음 동적 데이터 생성 됩니다 (기본적으로 두 번째 예와 반대). 다음은 동적 XML을 생성하는 방법의 예입니다.

dynamic doc = new XmlBuilder();
doc.articles(id=42, type="List", () => {
  article(() => {
    number(42);
    title("blahblubb");});});

이것은 동등한 Ruby만큼 아름답지는 않지만 짧은 시간에 생각 해낼 수있는 최선의 방법입니다. :-)

그리고 마지막으로 중요한 것은 동적 유형 언어와의 통합입니다. Silverlight 애플리케이션의 JavaScript이든, 비즈니스 앱에 포함 된 사용자 지정 규칙 엔진이든, CAD 프로그램 / IDE / 텍스트 편집기에서 호스팅하는 DLR 인스턴스이든 상관 없습니다.


MSDN 에는 한 가지 예가 있습니다 .

많은 COM 메서드는 형식을 개체로 지정하여 인수 형식 및 반환 형식의 변형을 허용합니다. 이로 인해 C #에서 강력한 형식의 변수와 조정하기 위해 값을 명시 적으로 캐스팅해야했습니다. / link (C # 컴파일러 옵션) 옵션을 사용하여 컴파일하는 경우 동적 형식을 도입하면 COM 서명의 개체 발생을 동적 형식 인 것처럼 처리 할 수 ​​있으므로 많은 캐스팅을 피할 수 있습니다.

또 다른 예는 동적 언어와 상호 운용해야하는 경우입니다.

또한 일부 코드를 제네릭으로 만들고 싶지만 객체가 동일한 메서드를 구현하더라도 필요한 메서드를 선언하는 적절한 기본 클래스 또는 인터페이스를 공유하지 않기 때문에 그렇게 할 수없는 경우가 있습니다. 이것의 예는 int와 short로 일반적인 것을 만들려고하는 것입니다. 약간의 해킹이지만 동적을 사용하면 이러한 다른 유형에서 동일한 메서드를 호출하여 더 많은 코드를 재사용 할 수 있습니다.

업데이트 : 여기에서 약간의 검색을 통해이 관련 게시물을 찾았 습니다 .


Walter Almeida의 블로그 : C #에서 동적 키워드를 사용하여 개체 방향을 향상시키는 시나리오 :

http://blog.walteralmeida.com/2010/05/using-the-dynamic-keyword-in-c-to-improve-objectorientation.html


Scott Watermasysk는 MongoDB C # 드라이버에서 사전 키 속성 매핑을위한 역학 사용에 대한 기사를 작성했습니다.

http://simpable.com/code/mongodb-dynamics/


다른 사람들이 지금까지 훌륭한 답변을했다고 생각하므로 David Hanson의이 예를 추가하고 싶습니다. Hist 게시물은 C #의 동적 유형에 대해 지금까지 찾은 가장 실용적인 응용 프로그램을 보여줍니다. 여기서 그는이를 사용하여 프록시 개체를 만듭니다. 이 예에서 그는 WPF 바인딩 오류에 대한 예외를 발생시킬 수있는 프록시를 만듭니다. 일반적으로 CustomTypeDescriptors 및 속성 설명자 개념을 사용하여 WPF 바인딩의 경우에도이 작업을 수행 할 수 있는지 확실하지 않지만 새로운 C # 4.0 동적 형식을 사용하는 것이 그 기능을 잘 보여주는 것이라고 생각합니다.

.net 4.0 Dynamics를 사용하여 WPF 및 Silverlight에서 바인딩 예외 발생

동적 형식에 대해 생각할 수있는 또 다른 용도는 WPF 또는 일반 개체 형식이 예상되고 리플렉션 메서드가 일반적으로 형식을 조사하는 데 사용되는 다른 위치에서 DataContext로 유사하게 연결할 수있는 프록시를 만드는 것입니다. 이러한 경우 특히 테스트를 빌드 할 때 동적 형식을 사용하면 테스트 전용 클래스 내에서 속성을 하드 코딩하지 않고도 동적 방식으로 프록시 개체에 의해 속성 접근자가 적절하게 호출되고 기록 될 수 있습니다.


나는 Scott Hanselman이 (첨부 된) 이것에 대한 흥미로운 기사를 읽었습니다. 그는 객체를 사용하는 것과는 반대로 컴파일러가 메서드가 있는지 알지 못하는 이전 COM 객체의 메서드를 참조하기 위해 동적을 사용할 수 있다고 지적합니다. 링크가 유용하다는 것을 알았습니다.

Scott Hanselman-C # 4 및 동적 키워드

참고 URL : https://stackoverflow.com/questions/2255982/c-sharp-4-real-world-example-of-dynamic-types

반응형