È possibile accedere alle variabili private di un oggetto utilizzando un metodo di estensione?I metodi di estensione C# possono accedere a variabili private?
risposta
No. È possibile fare lo stesso in un metodo di estensione come in un metodo statico "normale" in alcune classi di utilità.
Quindi questa estensione metodo
public static void SomeMethod(this string s)
{
// do something with 's'
}
è pari a circa il metodo di supporto statico come questo (almeno per quanto riguarda ciò che si può accedere):
public static void SomeStringMethod(string s)
{
// do something with 's'
}
(Naturalmente si può usare qualche riflessione in entrambi i metodi per accedere ai membri privati. Ma suppongo che non sia questo il punto di questa domanda.)
No, a meno che non si dia un qualche tipo di accesso a loro attraverso il supporto pubblico anni o un modello proxy.
No:
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;
}
}
un metodo di estensione è essenzialmente un metodo statico in modo che tutti si ha accesso a, i membri pubblici della istanza in cui il metodo di estensione è invocato su
No, non può.
Tuttavia, ti interesserà sapere che le altre risposte non sono corrette nel dire che i normali metodi statici non possono accedere ai campi privati. Un metodo statico può accedere ai campi membri privati non statici nella propria classe. Il seguente codice è perfettamente valido e mostra un metodo statico accesso a un campo privato:
public class Foo
{
private bool _field;
public static bool GetField(Foo foo)
{
return foo._field;
}
}
Ora ... torna alla tua domanda. Si potrebbe pensare che un metodo di estensione dovrebbe essere in grado di fare la stessa cosa, data la (non-esistente) "equivalenza" ai metodi statici che esistono altre risposte. Tuttavia, non è possibile dichiarare metodi di estensione all'interno di una classe nidificata. Quindi, se si tenta di effettuare le seguenti operazioni:
public class Foo
{
private bool _field;
public static class Extensions
{
public static bool GetField(this Foo foo)
{
return foo._field;
}
}
}
si otterrà un errore di compilazione dicendo
metodo di estensione deve essere definito in una classe statica di alto livello; Le estensioni sono una classe nidificata
Si noti che, in modo abbastanza interessante, la rimozione della parola chiave this
causa la corretta compilazione del codice. Le ragioni di questo sono discussi qui:
eccellenza in ingegneria. – Fattie
Se siete il proprietario la classe che si sta estendendo, è un dichiarare sempre la classe parziale, quindi estendere la classe & hanno accesso a tutti i membri privati in un file diverso ... Ma non useresti davvero i metodi di estensione.
utilizzare la riflessione
negativa, ma si potrebbe accedere a qualsiasi variabile privata di qualsiasi tipo utilizzando un altro metodo di estensione in questo modo:
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);
}
E poi accedere a un campo privato di un tipo arbitrario:
Foo foo = new Foo();
string privateBar = foo.GetFieldValue<string>("_bar");
+1. Per inciso, puoi avere metodi di estensione privati; c'è un bell'articolo su http://odetocode.com/Blogs/scott/archive/2009/10/05/private-extension-methods.aspx I metodi di estensione possono anche accedere ai membri statici privati della loro classe di utilità statica. – TrueWill
Anche se questo è contrassegnato come C#, questo vale per tutti i linguaggi .NET che forniscono supporto per i metodi di estensione. –
@TrueWill - ma poiché devono essere tipi statici, non nidificati e non generici, non possono realmente avere accesso privato alle variabili * dell'oggetto *. accesso 'interno', certo - ma non' privato'. –