2013-07-29 4 views
1

J'ai hérité de la classe PropertyDescriptor pour fournir des propriétés 'dynamiques'. J'ajoute quelques attributs au PropertyDescriptor. Cela fonctionne parfaitement.PropertyDescriptor et attributs

Lors de l'affichage d'un objet dans un PropertyGrid, le ReadOnlyAttribute fonctionne, mais le EditorAttribute ne fonctionne pas!

internal class ParameterDescriptor: PropertyDescriptor { 
    //... 
    public ParameterDescriptor(/* ... */) { 
     List<Attribute> a = new List<Attribute>(); 
     string editor = "System.ComponentModel.Design.MultilineStringEditor,System.Design"; 
     //... 
     a.Add(new ReadOnlyAttribute(true));       // works 
     a.Add(new DescriptionAttribute("text"));     // works 
     a.Add(new EditorAttribute(editor, typeof(UITypeEditor))); // doesn't work! 
     //...  
     this.AttributeArray = a.ToArray(); 
    } 
} 

L'objet qui est affiché utilise un TypeConverter hérité:

public class ParameterBoxTypeConverter: TypeConverter { 
    public override bool GetPropertiesSupported(ITypeDescriptorContext context) { 
     return true; 
    } 

    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) { 
     List<PropertyDescriptor> desc = new List<PropertyDescriptor>(); 
     //... 
     ParameterDescriptor d = new ParameterDescriptor(/* ... */); 
     desc.Add(d); 
     //.... 
     return new PropertyDescriptorCollection(desc.ToArray()); 
    } 

Je suis coincé, parce que le PropertyGrid est tout simplement pas rien montrer (je me attendais à un « ... » à la propriété valeur). Et il semble qu'il n'y a aucun moyen de déboguer!

Alors, comment puis-je trouver ce qui ne va pas ici?
Existe-t-il un moyen de déboguer dans le PropertyGrid, etc?

+0

Vous ne montrez pas ce que vous * faites * avec * a' ... passez-vous cela dans le ctor de base? ou...? –

+0

@MarcGravell: S'il vous plaît voir mon édition. – joe

Répondre

2

De quelques tests rapides, le nom doit être fuly qualifié:

const string name = "System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; 
attribs.Add(new EditorAttribute(name, typeof(UITypeEditor))); 

interne, il utilise Type.GetType et:

var type1 = Type.GetType("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); 
// ^^^ not null 
var type2 = Type.GetType("System.ComponentModel.Design.MultilineStringEditor, System.Design"); 
// ^^^ null 

Bien sûr, vous pouvez simplement utiliser:

attribs.Add(new EditorAttribute(typeof(MultilineStringEditor), typeof(UITypeEditor))); 

Alternativement, vous pouvez override GetEditor et faire ce que vous voulez.

+0

Bon point. Enfin, je ne peux pas utiliser la surcharge 'new EditorAttribute (typeof (MultilineStringEditor), typeof (UITypeEditor))' pour certaines raisons. Comment avez-vous trouvé 'Internally, il utilise Type.GetType' ??? – joe

+0

@joe manque-t-il une référence à 'System.Design.dll'? J'ai vérifié, et il a été déclaré comme public depuis 2.0, donc ça devrait fonctionner correctement. Quel message obtenez-vous? Re ce dernier: je l'ai ouvert dans le réflecteur. J'ai * pu * avoir aussi utilisé le téléchargement des symboles de débogage public, mais le réflecteur est plus pratique pour moi. –

+0

@joe pour info, la méthode responsable ici est 'PropertyDescriptor.GetTypeFromName'; malheureusement, alors qu'il est "protégé", ce n'est pas "virtuel", donc vous ne pouvez pas "remplacer" juste cela –