Remplacer une propriété publique à partir d'une classe dérivée
Dans un vieux projet, nous sommes à l'aide d'un tiers de l'assemblée avec une classe qui possède une propriété avec certains codé en dur renseignements:
public string ConnectionString
{
get
{
string[] fullDbName = new string[5];
fullDbName[0] = "Data Source=";
fullDbName[1] = this.dbServer;
fullDbName[2] = ";Initial Catalog=";
fullDbName[3] = this.FullDbName;
fullDbName[4] = ";Integrated Security=SSPI;Pooling=false";
return string.Concat(fullDbName);
}
}
J'ai besoin d'être en mesure de construire la chaîne de connexion de mon auto. J'ai donc essayé de faire une classe dérivée qui cache l'origine de la propriété, mais il ne semble pas fonctionner:
public class SqlServerRestorerExstension : SQLServerRestorer
{
public SqlServerRestorerExstension(string dbServer, string dbName, string dbFilePath, string dbDataFileName, string dbLogFileName, bool detachOnFixtureTearDown, string connectionstring) : base(dbServer, dbName, dbFilePath, dbDataFileName, dbLogFileName, detachOnFixtureTearDown)
{
ConnectionString = connectionstring;
}
public string ConnectionString { get; private set; }
}
Est-il possible de faire réaliser quelque manière que ce soit quand je n'ai pas accès à la troisième partie du code?
Ne SQLServerRestorer mettre en œuvre une interface qui a la propriété ConnectionString déclara-t-il?
Non, la propriété ConnectionString est déclarée comme une propriété publique sur la classe SQLServerRestorer.
Non, la propriété ConnectionString est déclarée comme une propriété publique sur la classe SQLServerRestorer.
OriginalL'auteur peterbf | 2012-02-07
Vous devez vous connecter pour publier un commentaire.
Comme d'autres l'ont souligné, vous pouvez utiliser le
new
mot-clé pour masquer le membre de base de la propriété. Notez toutefois que ce n'est pas comme par magie transformer leConnectionString
d'une propriété dans une fonction polymorphe, c'est à dire si vous avez quelque chose comme ceci:et pour ce faire:
Puis vous verrez toujours une "une" imprimé sur la console. En fait, le
new
mot-clé juste s'arrête au compilateur de l'émission d'un avertissement concernant la dissimulation de la membre de la classe de base. Il ne change pas le comportement du code lors de l'exécution.Vous pouvez essayer d'utiliser un pattern Décorateur et envelopper le
SQLServerRestorer
, mais si cela ne fonctionne pas non plus, vous êtes hors de la chance j'ai peur.Je ne pense pas que le Décorateur modèle d'aide, parce que le SQLServerRestorer-classe est utilisée pour définir une variable dans la troisième partie du code et, par conséquent, l'original de la propriété ConnectionString seront appliqués.
C'est ce que je craignais, sinon le truc avec masquage de la propriété aurait probablement fonctionné aussi bien. Vous pouvez essayer votre chance avec un aspect framework orienté comme PostSharp ou Coup qui vous permet de modifier les propriétés d'un assemblage existant par MSIL injection.
Merci pour votre suggestion. Fait, j'ai fini d'écrire mon propre mise en œuvre de ce que le troisième composant de partie - il n'a fallu que quelques heures pour que semblait être la solution la plus simple.
OriginalL'auteur afrischke
Vous devrez indiquer que vous voulez "remplacer" cette propriété, à l'aide de
new
:Évidemment, vous pouvez étendre cela à mettre en place votre propre
set
, même si c'est juste pour utiliser l'auto-mise en œuvre des accesseurs. De la Documentation sur "versioning" avecnew
peut être trouvé ici, mais plus spécifiquement:OriginalL'auteur Grant Thomas
Vous êtes à la recherche pour le
new
mot-clé:OriginalL'auteur Yuck
Vous voulez remplacer la méthode, mais il semble que vous ne pouvez pas:
Bien que d'autres indiquent que vous pouvez utiliser le nouveau modificateur, je ne pense pas que vous sera bien utile:
Pour moi, qui sonne comme n'importe quel code à l'aide de la base (3ème partie) type d'invoquer l'ancienne propriété - c'est un désordre qui attendent juste d'arriver!
new
modificateur est utilisé pour en C#.Vraiment l'OP veut remplacer la propriété. Et l'OP n'est pas à l'aide de
override
tel qu'il est.exactement droit de l'OP veut changer le comportement d'un objet qu'il n'a pas la source.
new
permettra de faire exactement cela. Il n'essaie pas de combinéoverride
etnew
comme suggéré ici.C'est dommage qu'il n'y aucun moyen de déclarer un "remplacement" et un "nouveau" membre du même nom dans la même classe; une telle possibilité permettrait une propriété en lecture seule à être substituée par une nouvelle mise en œuvre, et aussi de l'ombre à une lecture-écriture, ou de permettre à une classe de base une fonction qui retourne un type de base, pour être remplacé par un dérivé de la classe de fonction qui retourne un type dérivé. Pour être sûr, si d'autres moyens existaient pour faire de telles choses, celles-ci pourraient être tout aussi bon, mais en exigeant un niveau supplémentaire à la hiérarchie d'héritage pour accomplir leur semble laid.
peut-être que je suis de comprendre quelque chose de mal ici, mais si vous passez ce nouvel objet dans une méthode attendent à ce que la classe de base, alors pourquoi ne pas l'ancienne propriété d'être récupérées? C'est,
new
de ne pas être polymorphe? Ce est un problème...OriginalL'auteur Daren Thomas