Wat is het C # Equivalent van vriend? [DUPLICEER]

mogelijk Duplicaat:
Waarom levert C # niet de C++ -type ‘vriend’ ‘Trefwoord?

Ik wil graag dat de privé-ledenvariabelen van een klasse toegankelijk zijn voor een testklasse zonder ze bloot te stellen aan andere klassen.

In C++ zou ik de Tester-klasse gewoon als vriend verklaren, hoe doe ik dit in C #? Kan iemand me een voorbeeld geven?


Antwoord 1, Autoriteit 100%

Er is geen direct equivalent van “vriend” – het dichtst bij dat beschikbaar is (en het is niet erg dichtbij) is Internalvisibleto . Ik heb dit attribuut ooit gebruikt voor testen – waar het erg handig is!

Voorbeeld: om in AssemblyInfo.cs

te plaatsen

[assembly: InternalsVisibleTo("OtherAssembly")]

Antwoord 2, Autoriteit 33%

Het equivalent Closet is om een ​​geneste klasse te maken die in staat is om toegang te krijgen tot de particuliere leden van de buitenklasse. Zoiets als volgt:

class Outer
{
    class Inner
    {
       // This class can access Outer's private members
    }
}

of als u de innerlijke klasse in een ander bestand wilt plaatsen:

Outer.cs
partial class Outer
{
}
Inner.cs
partial class Outer
{
    class Inner
    {
       // This class can access Outer's private members
    }
}

Antwoord 3, Autoriteit 17%

Neem een heel gewoon patroon. Class Factory maakt widgets. De fabrieksklasse moet met de binnenkant rommelen, want het is de fabriek. Beide zijn geïmplementeerd in hetzelfde bestand en zijn, door ontwerp, verlangen en aard, nauw gekoppelde klassen — in feite is Widget eigenlijk gewoon een uitvoertype uit de fabriek.

Maak in C++ de Factory een vriend van de Widget-klasse.

Wat kunnen we in C# doen? De enige fatsoenlijke oplossing die bij me is opgekomen, is om een interface uit te vinden, IWidget, die alleen de openbare methoden blootlegt, en de IWidget-interfaces in de fabriek terug te laten keren.

Dit brengt behoorlijk wat verveling met zich mee – alle van nature openbare eigendommen opnieuw blootleggen in de interface.


Antwoord 4, autoriteit 5%

Er is geen ‘vriend’-sleutelwoord in C#, maar een optie voor het testen van privémethoden is om System.Reflection te gebruiken om de methode te begrijpen. Hiermee kunt u privémethoden aanroepen.

Gegeven een klas met deze definitie:

public class Class1
{
    private int CallMe()
    {
        return 1;
    }
}

Je kunt het aanroepen met deze 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);

Als u Visual Studio Team System gebruikt, kunt u VS automatisch een proxyklasse laten genereren met privé-accessors erin door met de rechtermuisknop op de methode te klikken en “Eenheidstests maken…” te selecteren.


Antwoord 5, autoriteit 3%

U kunt een vriendin-toegang simuleren als de klasse die het recht op toegang krijgt, in een ander pakket is en als de methoden die u blootstelt, zijn gemarkeerd als intern of intern beschermd. U moet de assembly wijzigen die u wilt delen en voegt u de volgende instellingen toe aan Assemblyinfo.cs:

// Expose the internal members to the types in the My.Tester assembly
[assembly: InternalsVisibleTo("My.Tester, PublicKey=" +
"012700000480000094000000060200000024000052534131000400000100010091ab9" +
"ba23e07d4fb7404041ec4d81193cfa9d661e0e24bd2c03182e0e7fc75b265a092a3f8" +
"52c672895e55b95611684ea090e787497b0d11b902b1eccd9bc9ea3c9a56740ecda8e" +
"961c93c3960136eefcdf106955a4eb8fff2a97f66049cd0228854b24709c0c945b499" +
"413d29a2801a39d4c4c30bab653ebc8bf604f5840c88")]

De openbare sleutel is optioneel, afhankelijk van uw behoeften.

Other episodes