2017-05-08 11 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); 
      } 
     } 
    } 
関連する問題