J'ai une hiérarchie de classe comme celui-ciComment gérer l'accès et les collections de membres privés?
public class A
{
protected class B
{
String Name { get; set; }
}
protected class C : KeyedCollection<String, B>
{
// ...
}
protected C Collection { get; }
// ...
public A Copy()
{
// Creates a deep copy of this instance.
}
}
Maintenant, je voudrais écrire un test unitaire pour comparer si deux instances de A ont les mêmes éléments B dans la KeyedCollection propriété. Cependant, je ne suis pas en mesure d'effectuer une boucle foreach dans les instances A. Ce que j'avais essayé,
[TestClass]
public class TestClass
{
public void ATest()
{
A original = new A();
A copy = A.Copy();
// ...
A_Accessor originalAccessor = A_Accessor.AttachShadow(original);
A_Accessor copyAccessor = A_Accessor.AttachShadow(copy);
foreach(var originalItem in originalAccessor.Collection)
{
var copyItem = copyAccessor[originalItem.Name];
Assert.AreEqual(originalItem, copyItem);
}
}
}
Ce code ne compile même pas parce que l'accesseur de classe C n'implémente pas l'interface IEnumerable (il ne met pas en oeuvre aucune interface de la classe KeyedCollection). Est-ce que quelqu'un a une idée sur comment puis-je surmonter ce problème?
Le message d'erreur que je reçois est
déclarationforeach ne peut pas fonctionner sur des variables de type « C » parce que « A_Accessor.C » ne contient pas de définition publique pour « GetEnumerator »
Le code d'origine était incorrect. Je l'ai mis à jour. Les deux classes, B et C sont protégées et non privées. –
Encore une information, l'erreur de compilation que j'obtiens est sur la ligne de boucle foreach. –
J'ai trouvé une solution très similaire à la vôtre. L'instruction var copyItem = copyAccessor [casted.Name] ne fonctionnera pas, car C_Accessor n'implémente pas d'indexeur de type String. Je l'ai surmonté en utilisant la méthode First extension avec un prédicat pour renvoyer l'élément correct. Merci de votre aide! –