J'avais le même problème aujourd'hui et j'avais une solution qui fonctionnait pour des objets de données simples qui n'ont pas de logique propre. Au lieu de rendre le setter obsolète (ce qui ne fonctionne pas pour les raisons mentionnées dans les autres réponses), j'ai rendu obsolète le constructeur lui-même et en ai introduit un nouveau où je fournis la valeur initiale. Cela suppose que le constructeur par défaut a été exécuté pour créer l'instance de la classe. Peut-être que tu devrais en marquer un autre.
Cependant, nous ne pouvez pas utiliser les propriétés implémentées automatiquement dans ce cas, afin de pouvoir définir la valeur initiale dans le constructeur:
class MyClass
{
[Obsolete("Use the constructor with param myProperty instead")] MyClass() { }
MyClass(MyProperty m) { this.m_MyProperty = m; }
public MyType MyProperty
{
get { return this.m_MyProperty; }
set { this.m_MyProperty = value; }
}
}
Donc, en fait, je créé une readonly-propriété dont la valeur peut seulement être fixé par le constructeur. Toute attemp créer une instance par son défaut constructeur et de définir sa propriété ne produira pas le compilateur d'avertissement pour le poseur mais pour l'instanciation - ce qui est correct dans mon cas:
var m = new MyClass(); // here we get warning/error now
m.MyProperty =
Soyez conscient que ce doesn Ne travaillez pas si votre propriété ne doit pas être réglée à partir du en dehors de. Ceci est lorsque sa valeur est calculée dans votre nouveau code:
MyProperty { get { return /* some computation */ } }
Puisque vous l'avez mis à soulever des erreurs, pourquoi ne pas supprimer tout simplement le poseur, ils vont être informé qu'il est en lecture seule. – Doggett
Vous pouvez toujours désactiver l'erreur en utilisant la directive '#pragma warning', même s'il ne s'agit pas seulement d'un avertissement. De cette façon, le code existant sera toujours construit, tandis que le code futur ne le sera pas. –