2010-11-05 3 views
4

Nous utilisons DynamicObject pour la création de propriétés dynamiques, mais nous voulons utiliser PropertyGrid pour afficher ces propriétés et les éditer.Comment substituer PropertyDescriptor.GetValue et PropertyDescriptor.SetValue pour un objet dynamique dans .NET 4

Premièrement, j'ai trouvé l'article this, et ceci one. J'essaie d'utiliser le code article deuxième, mais de manière plus générique, essentiellement pour remplacer toutes les méthodes noms constantes avec des variables. Mais le problème est que VS2010 ne peut pas trouver le type CSharpGetMemberBinder.

Est-ce que quelqu'un sait comment le remplacer? ou quelle est la meilleure approche?

Répondre

1

Au lieu d'utiliser cet article de classe Helper (qui est pas à jour), vous pouvez simplement jeter à IDictionary et définir/récupérer les valeurs:

 public override object GetValue(object component) 
     { 
      if (_owner != component) throw new InvalidOperationException("GetValue can only be used with the descriptor's owner."); 
      //return DynamicHelper.GetValue(component, _propertyName); 
      return ((IDictionary<String, object>)component)[_propertyName]; 
     } 

     public override void SetValue(object component, object value) 
     { 
      if (_owner != component) throw new InvalidOperationException("SetValue can only be used with the descriptor's owner."); 
      OnValueChanged(component, EventArgs.Empty); 
      //DynamicHelper.SetValue(component, _propertyName, value); 
      ((IDictionary<String, object>)component)[_propertyName] = value; 
     } 

Edit: Ceci ne peut fonctionner que dans le cas de ExpandoObjects, qui était ce que l'article utilisait .. si vous avez créé votre propre classe dynamique avec un support différent, vous devrez peut-être changer cela.

+0

Oui, il est classe dynamique personnalisée dérivée de DynamicObject –

+0

parfaitement travaillé. – Wolf5

+0

Aldo si vous voulez pouvoir éditer ceux-ci vérifiez le public override Type PropertyType {get {return typeof (object); }} code. Le remplacer rapidement par une chaîne fonctionne pour les chaînes. Si son objet le PropertyGrid semble être en lecture seule. – Wolf5

1

Vous pouvez utiliser le framework open source Dynamitey il vous permet d'appeler les propriétés dynamiques de touteIDynamicMetaObjectProvider par nom de chaîne.

public override object GetValue(object component) 
    { 
     return Dyanmic.InvokeGet(component,propertyName); 
    } 

    public override void SetValue(object component, object value) 
    { 
     Dyanmic.InvokeSet(component,propertyName, value); 
    } 
0

Il devrait être quelque chose comme:

CallSiteContainer.getLengthSite = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, 
    "Length", 
    typeof(Program), 
    new CSharpArgumentInfo[] { 
     CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) 
    })); 

et l'ensemble associé serait quelque chose comme:

CallSiteContainer.setLengthSite = CallSite<Func<CallSite, object, object, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, 
    "Length", 
    typeof(Program), 
    new CSharpArgumentInfo[] { 
     CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), 
     CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null) 
    })); 
Questions connexes