.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 :

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 :