Eine Assembly, die ich nicht ändern kann (vom Hersteller bereitgestellt), deren Methode einen Objekttyp zurückgibt, die jedoch tatsächlich vom internen Typ ist.
Wie kann ich von meiner Assembly aus auf die Felder und / oder Methoden des Objekts zugreifen?
Beachten Sie, dass ich die vom Hersteller bereitgestellte Baugruppe nicht ändern kann.
Im Wesentlichen habe ich Folgendes:
Vom Anbieter:
internal class InternalClass
public string test;
end class
public class Vendor
private InternalClass _internal;
public object Tag {get{return _internal;}}
end class
Aus meiner Baugruppe mit der Lieferantenbaugruppe.
public class MyClass
{
public void AccessTest()
{
Vendor vendor = new Vendor();
object value = vendor.Tag;
// Here I want to access InternalClass.test
}
}
InternalsVisibleTo
Ihre Baugruppe verwendet , aber nicht eingeschlossen? Wenn das Symbol nicht wirklich verborgen ist, ist es Teil des ABI.Ich sehe nur einen Fall, in dem Sie zulassen würden, dass Ihre internen Mitglieder einer anderen Versammlung ausgesetzt werden, und zwar zu Testzwecken.
Angenommen, es gibt eine Möglichkeit, "Friend" -Baugruppen Zugriff auf Interna zu gewähren:
In der Datei AssemblyInfo.cs des Projekts fügen Sie für jede Baugruppe eine Zeile hinzu.
Diese Informationen finden Sie hier.
Hoffe das hilft.
quelle
Ich möchte einen Punkt argumentieren - dass Sie die ursprüngliche Baugruppe nicht erweitern können - mit Mono.Cecil können Sie
[InternalsVisibleTo(...)]
die 3pty-Baugruppe injizieren . Beachten Sie, dass es rechtliche Auswirkungen geben kann - Sie haben Probleme mit der 3pty-Baugruppe und den technischen Auswirkungen -, wenn die Baugruppe einen starken Namen hat, müssen Sie sie entweder entfernen oder mit einem anderen Schlüssel neu signieren.Und der Code mag:
quelle
Reflexion.
Nutze die Kraft mit Bedacht. Vergessen Sie nicht die Fehlerprüfung. :) :)
quelle
Das kannst du nicht. Interne Klassen können außerhalb ihrer Assembly nicht sichtbar sein, daher gibt es natürlich keine explizite Möglichkeit, direkt darauf zuzugreifen. Die einzige Möglichkeit besteht darin, die späte Laufzeitbindung über Reflektion zu verwenden. Anschließend können Sie indirekt Methoden und Eigenschaften aus der internen Klasse aufrufen.
quelle