Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

CoqBlog

.NET is good :-)
{ Blog de Gaël Covain }

Actualités

.NET : S'il fallait une raison de plus d'éviter de définir des propriétés en écriture seule (write-only)...

... j'en ai découverte une en lisant une entrée sur Connect : la méthode TypeDescriptor.GetProperties ne retourne pas les propriétés pour lesquelles l'accesseur get n'est pas défini.

L'entrée a été close avec un statut "By Design", accompagné d'un commentaire assez explicite :

Posted by Microsoft on 7/5/2010 at 8:29 PM
This is by design. We don't consider write-only properties. In our implementation, we check if the get method is null. I'll contact our people to update msdn.

Source : TypeDescriptor.GetProperties returns null for properties that only have a setter | Microsoft Connect

Je déteste les propriétés en écriture seule.
Je trouve celà contre-nature, et déstabilisant à l'usage : qui s'attend à ce qu'une propriété ne retourne pas de valeur ? (haaa, la bonne vieille erreur de compilation "The property or indexer 'MyClass.MyProperty' cannot be used in this context because it lacks the get accessor"...).
Personnellement, je leur préfère toujours une méthode.

Dans le cas de l'impact sur TypeDescriptor.GetProperties voici un petit exemple.
Ce code* :

class Program
{
static void Main(string[] args)
{
Console.WriteLine("Type.GetProperties : ");
Type weirdClassType = typeof(WeirdClass);
PropertyInfo[] propInformations =
weirdClassType.GetProperties();
Console.WriteLine(" Count : {0}",
propInformations.Length);
foreach (PropertyInfo propInfo in propInformations)
{
Console.WriteLine(" {0}", propInfo.Name);
}

Console.WriteLine();
Console.WriteLine("TypeDescriptor.GetProperties : ");
WeirdClass instance = new WeirdClass();
PropertyDescriptorCollection propDescriptors =
TypeDescriptor.GetProperties(instance);
Console.WriteLine(" Count : {0}",
propDescriptors.Count);
foreach (PropertyDescriptor propDes in propDescriptors)
{
Console.WriteLine(" {0}", propDes.Name);
}
}

class WeirdClass
{
private String _name;

public String GetName
{
get { return this._name; }
}

public String SetName
{
set { this._name = value; }
}
}
}

donnera l'affichage suivant :

Capture d'écran de la Console montrant le résultat d'exécution du code d'exemple

On voit bien le manque de la propriété SetName sur le retour de TypeDescriptor.GetProperties, alors que Type.GetProperties la découvre bien.

* : pardonnez le manque d'espacements, l'addin de formatage de code ne semble plus les apprécier.

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mardi 6 juillet 2010 23:58 par coq
Classé sous : ,

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le il y a 10 heures et 26 minutes

- Perspective 3.0 pour Silverlight 5.0 par Perspective le il y a 11 heures et 46 minutes

- TechDays Paris 2012 : Top 10 des Best Practices pour SQL Server par Blog Technique de Romelard Fabrice le il y a 17 heures et 23 minutes

- TechDays Paris 2012 : Kinect + Office 365 un bon geste pour votre SI par Blog Technique de Romelard Fabrice le il y a 17 heures et 46 minutes

- TechDays Paris 2012 : Pleinière du premier jour par Blog Technique de Romelard Fabrice le il y a 18 heures et 1 minutes

- [SharePoint 2010] Erreur d’analyse de contenu “L’élément SharePoint en cours d’analyse a renvoyé une erreur lors de la demande de données auprès du se... par Julien Chable le il y a 22 heures et 34 minutes

- [TechDays2012] Oui j’y serai! par Blog de Jérémy Jeanson le 02-06-2012, 22:13

- TFS Integration Tools – Suivi des synchronisations avec Reporting Services par Vivien Fabing le 02-05-2012, 17:46

- CSS Content State Selectors (Personnal Draft) par Le blog de FremyCompany le 02-04-2012, 15:38

- MBA : Pourquoi faire et comment le choisir ? par Blog Technique de Romelard Fabrice le 02-03-2012, 14:22