Ist es möglich, mit einer Erweiterungsmethode auf die privaten Variablen eines Objekts zuzugreifen?
Antworten:
Nein. Sie können in einer Erweiterungsmethode dasselbe tun wie in einer "normalen" statischen Methode in einigen Dienstprogrammklassen.
Also diese Erweiterungsmethode
public static void SomeMethod(this string s)
{
// do something with 's'
}
entspricht einer statischen Hilfsmethode wie dieser (zumindest in Bezug auf das, worauf Sie zugreifen können):
public static void SomeStringMethod(string s)
{
// do something with 's'
}
(Natürlich können Sie in beiden Methoden einige Überlegungen anstellen, um auf private Mitglieder zuzugreifen. Aber ich denke, das ist nicht der Punkt dieser Frage.)
internal
Zugang, sicher - aber nicht private
.
Nein, ich kann nicht.
Sie werden jedoch interessiert sein zu wissen, dass die anderen Antworten falsch sind, wenn gesagt wird, dass normale statische Methoden nicht auf private Felder zugreifen können. Eine statische Methode kann auf private nicht statische Mitgliedsfelder in ihrer eigenen Klasse zugreifen. Der folgende Code ist vollkommen gültig und zeigt eine statische Methode, die auf ein privates Feld zugreift:
public class Foo
{
private bool _field;
public static bool GetField(Foo foo)
{
return foo._field;
}
}
Nun ... zurück zu Ihrer Frage. Sie könnten denken, dass eine Erweiterungsmethode in der Lage sein sollte, dasselbe zu tun, da (nicht vorhandene) "Äquivalenz" zu statischen Methoden besteht, von denen andere Antworten behaupten, dass sie existieren. Sie können jedoch keine Erweiterungsmethoden innerhalb einer verschachtelten Klasse deklarieren. Wenn Sie also Folgendes versuchen:
public class Foo
{
private bool _field;
public static class Extensions
{
public static bool GetField(this Foo foo)
{
return foo._field;
}
}
}
Sie erhalten einen Kompilierungsfehler
Die Erweiterungsmethode muss in einer statischen Klasse der obersten Ebene definiert werden. Extensions ist eine verschachtelte Klasse
Interessanterweise führt das Entfernen des this
Schlüsselworts dazu, dass der Code ordnungsgemäß kompiliert wird. Die Gründe hierfür werden hier diskutiert:
Nein:
public class Foo
{
private string bar;
}
public static class FooExtensions
{
public static void Test(this Foo foo)
{
// Compile error here: Foo.bar is inaccessible due to its protection level
var bar = foo.bar;
}
}
Nicht empfohlen, aber Sie können möglicherweise mit einer anderen Erweiterungsmethode wie folgt auf jede private Variable eines beliebigen Typs zugreifen:
public static T GetFieldValue<T>(this object obj, string name) {
var field = obj.GetType().GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
return (T)field?.GetValue(obj);
}
Und dann auf ein privates Feld eines beliebigen Typs zugreifen:
Foo foo = new Foo();
string privateBar = foo.GetFieldValue<string>("_bar");
Nein, es sei denn, Sie gewähren ihnen Zugriff über öffentliche Eigenschaften oder ein Proxy-Muster.
Wenn Sie die Klasse besitzen, die Sie erweitern, deklarieren Sie die Klasse immer als Teil, erweitern Sie die Klasse und haben Zugriff auf alle privaten Mitglieder in einer anderen Datei ... Aber Sie würden nicht wirklich Erweiterungsmethoden verwenden.
Eine Erweiterungsmethode ist im Wesentlichen eine statische Methode. Sie haben also nur Zugriff auf die öffentlichen Mitglieder der Instanz, für die die Erweiterungsmethode aufgerufen wird