잊지 않겠습니다.

1. Dynamic Lookup

.NET Framework 2009. 1. 7. 12:56


method나 instance를 동적으로 가능하도록 변경.

COM, IronPython, HTML DOM 또는 Reflection을 통해 얻어진 객체에 대한 동적인 접근이 가능.

 

The Dynamic Type

C# 4.0에서는 "dynamic" 으로 지정된 Type의 경우에는 runtime 시에 객체의 Byte code를 생성하게 된다.

 

  1. dynamic d = GetDynamicObject(....);  
  2. d.M(7)  

C# compiler에서 Compile시에 dynamic으로 지정된 Instance의 경우에는 Compile시에 넘어가게 되고, runtime시에 method를 각 parameter의 type에 따라서 구현, 실행하게 된다. 

이는 Type에서만 구현되는 것이 아닌, Method, Property 에서도 역시 같이 구현되게 된다.

 

: 상당히 멋진 기능이라고 생각되긴 하는데.. C#이 가진 선언적 언어 특성을 많이 버리는 느낌이 든다. 일단 백서에도 나와있듯이 안정성과 속도를 조금은 버리는 작업이기 때문에 사용하는 것에 있어서 많은 생각을 해봐야지 될것 같다. 무엇보다 Python이 아닌 IronPython의 객체를 얻어오는 것이라서, MS 가 아닌 다른 언어의 객체에 대한 구현은 조금 후에 알아봐야지 될것 같다. (분명히 Python도 되게 하는 방법이 생길것이다.)

 

: 그리고, 이미 사용되고 있는 곳은 매우 많다. Reflection을 통한 invoke와 너무나도 유사한 기능으로 Reflection의 확장으로 보이는 것은 나만의 착각인것일까? 

 

: 생각하지 못했던 내용이 있었다. JSON 데이터 포멧의 경우에는 자유롭게 확장들이 가능해진다. 사용되는 Class의 Property가 무엇인지만 알면 dynamic으로 선언해서 데이터를 얻어오고, 데이터에 대한 객체화가 매우 자유롭게 바뀌게 된다. 

  1. string jsonText = "{ xyz: 123, items: [ 10, 100, 1000 ] }";  
  2.   
  3. JsonReader jsonReader = new JsonReader(jsonText);  
  4. dynamic jsonObject = jsonReader.ReadValue();  
  5.   
  6. dynamic items = jsonObject.items;  
  7. items.Item(2, 1001);  
  8.   
  9. dynamic bar = new JsonObject();  
  10. bar.name = "c#";  
  11. jsonObject.bar = bar;  
  12.   
  13. JsonWriter writer = new JsonWriter();  
  14. writer.WriteValue((object)jsonObject);  
  15.   
  16. string newJsonText = writer.Json;  

 


Runtime Lookup

1. COM objects

: IDispatch를 통한 COM object의 이용. 

2. Dynamic objects

: IDynamicObject interface를 상속한 Class 

3. Plain objects 

: Standard .NET Object

위의 3가지 경우에서 Runtime lookup을 사용가능하다.  

 

  1. dynamic d1 = new Foo();  
  2. dynamic d2 = new Bar();  
  3. string s;  
  4.   
  5. d1.M(s, d2, 3, null);  

 

The Dynamic Langauage Runtime(DLR)

New API in .NET 4.0: DLR은 C#만이 아닌 .NET 기반의 다른 언어들에 대한 변환을 제공 

 

Open Issues

  • Extendted Method에 대한 지원을 할 수 없다. Dynamic으로 선언된 Instance에 대한 Extented Method를 구현하는 것은 불가능하다.
  • Anonymous functions은 dynamic method call에서 지원할 수 없다. 아래와 같은 코드는 사용 불가능하다.
  1. dynamic collection = ....;  
  2. var result = collection.Select(e=>e+5); //사용 불가능하다.  

 

 

Posted by Y2K
,