Double Possible:
Pourquoi est-ce que C# ne pas fournir le style C++ " ami " mot-clé?J'aimerais que le député variables d'une classe à être accessible à un Testeur de classe sans les exposer à d'autres classes.
En C++, je venais tout juste de déclarer la classe Testeur comme un ami, comment je peux le faire en C#? Quelqu'un peut-il me donner un exemple?
Réponses
Trop de publicités?Il n’y a pas d’équivalent direct de « ami » - le plus proche qui est disponible (et il n’est pas très proche) est InternalsVisibleTo. Je n’ai jamais utilisé cet attribut d’essai - où il est très pratique !
Prenez un schéma très commun. Classe marques de Fabrique de Widgets. L'Usine besoins de la classe de bricolons avec le fonctionnement interne, car c'est à l'Usine. Les deux sont mis en œuvre dans le même fichier, et sont, de par leur conception et leur désir et de la nature, étroitement associée des classes -- en fait, Widget est vraiment juste un type de sortie d'usine.
En C++, faire de l'Usine, un ami de classe de Widget.
En C#, que pouvons-nous faire? La seule solution décente qui a eu lieu pour moi, c'est inventer une interface, IWidget, qui expose les méthodes publiques, et de demander à l'Usine de retour IWidget interfaces.
Cela implique une bonne quantité d'ennui - d'exposer toutes les naturellement des propriétés publiques de nouveau dans l'interface.
Il n'y a pas un 'ami' mot-clé en C#, mais une option pour les essais privés méthodes est d'utiliser le Système.La réflexion pour obtenir un handle de la méthode. Cela vous permettra d'invoquer des méthodes privées.
Étant donné une classe avec cette définition:
public class Class1
{
private int CallMe()
{
return 1;
}
}
Vous pouvez l'invoquer l'aide de ce code:
Class1 c = new Class1();
Type class1Type = c.GetType();
MethodInfo callMeMethod = class1Type.GetMethod("CallMe", BindingFlags.Instance | BindingFlags.NonPublic);
int result = (int)callMeMethod.Invoke(c, null);
Console.WriteLine(result);
Si vous utilisez Visual Studio Team System, alors vous pouvez obtenir VS pour générer automatiquement une classe proxy privé accesseurs en cliquant droit sur la méthode et en sélectionnant "Créer des Tests Unitaires..."
Vous pouvez simuler un accès ami si la classe qui bénéficie d’un droit d’accès est à l’intérieur d’un autre paquet et si les méthodes que vous exposez sont marquées comme internes ou internes protégées. Vous devez modifier l’assembly que vous souhaitez partager et ajoutez les paramètres suivants à AssemblyInfo.cs :
La clé publique est facultative, selon vos besoins.