2017-05-08 2 views
0

Existe-t-il un moyen d'accéder à un NameValueCollection (comme Request.Form ou ConfigurationManager.AppSettings) en tant qu'objet dynamique? Je voudrais pouvoir faire quelque chose comme ceci:Comment accéder à NameValueCollection (comme Request.Form ou ConfigurationManager.AppSettings) en tant qu'objet dynamique?

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"] 

(cette question est basée sur Convert a NameValueCollection to a dynamic object)

Répondre

0

Vous pouvez écrire un adaptateur qui enveloppe votre NameValueCollection et qui hérite de DynamicObject. Vous pouvez ensuite créer une méthode d'extension qui instancie l'adaptateur. Pour finir, vous pouvez rendre votre classe wrapper implicitement castable à NameValueCollection original, ainsi vous pouvez utiliser la collection enveloppée partout où vous seriez capable d'utiliser la collection originale:

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); 
      } 
     } 
    }