2017-05-08 14 views
0

NameValueCollection (예 : Request.Form 또는 ConfigurationManager.AppSettings)을 동적 객체로 액세스하는 방법이 있습니까? 나는 이런 식으로 뭔가를 할 수 있도록하고 싶습니다 :NameValueCollection (예 : Request.Form 또는 ConfigurationManager.AppSettings)을 동적 객체로 액세스하려면 어떻게해야합니까?

var settings = ConfigurationManager.AppSettings.AsDynamic(); 
var name = settings.Name; // ConfigurationManger.AppSettings["Name"] 

// but also 

settings.Name = "Jones"; // modify the original collection 

// and 

var form = Request.Form.AsDynamic(); 
var email = form.Email; // Request.Form["Email"] 

(이 질문에 Convert a NameValueCollection to a dynamic object을 기반으로)

답변

0

당신은 당신의 NameValueCollection은을 감싸고 그 DynamicObject에서 상속 어댑터를 작성할 수 있습니다. 그런 다음 어댑터를 인스턴스화하는 확장 메소드를 작성할 수 있습니다. 이 작업을 끝내려면 래퍼 클래스를 원본 NameValueCollection에 암시 적으로 캐스팅 할 수 있도록 원래 컬렉션을 사용할 수있는 모든 위치에 래핑 된 컬렉션을 사용할 수 있습니다.

public static class Utility 
    { 
     public static dynamic AsDynamic(this NameValueCollection collection) 
     { 
      return (NameValueCollectionDynamicAdapter)collection; 
     } 

     private class NameValueCollectionDynamicAdapter : DynamicObject 
     { 
      private NameValueCollection collection; 

      public NameValueCollectionDynamicAdapter(NameValueCollection collection) 
      { 
       this.collection = collection ?? throw new NullReferenceException(nameof(collection)); 
      } 

      public override bool TryGetMember(GetMemberBinder binder, out object result) 
      { 
       result = collection[binder.Name]; 
       return true; 
      } 

      public override bool TrySetMember(SetMemberBinder binder, object value) 
      { 
       collection[binder.Name] = value?.ToString(); 
       return true; 
      } 

      public static implicit operator NameValueCollection(NameValueCollectionDynamicAdapter target) 
      { 
       return target.collection; 
      } 

      public static explicit operator NameValueCollectionDynamicAdapter(NameValueCollection collection) 
      { 
       return new NameValueCollectionDynamicAdapter(collection); 
      } 
     } 
    }