¿Es posible acceder a las variables privadas de un objeto utilizando un método de extensión?¿Los métodos de extensión Can C# acceden a variables privadas?
Respuesta
No. Puede hacer lo mismo en un método de extensión que en un método estático "normal" en alguna clase de utilidad.
Así que esta extensión método
public static void SomeMethod(this string s)
{
// do something with 's'
}
es equivalente a algún método de ayuda estático como sigue (al menos en cuanto a lo que puede acceder):
public static void SomeStringMethod(string s)
{
// do something with 's'
}
(Por supuesto que podría utilizar un poco de reflexión en el cualquiera de los métodos para acceder a miembros privados. Pero supongo que ese no es el punto de esta pregunta.)
No, a menos que les dé algún tipo de acceso a ellos a través de public pro erties o un patrón de 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 método de extensión es esencialmente un método estático por lo que lo único que tiene acceso a son los miembros públicos de la instancia en la que se invoca el método de extensión en
No, no puede.
Sin embargo, le interesará saber que las otras respuestas son incorrectas al decir que los métodos estáticos normales no pueden acceder a los campos privados. Un método estático puede acceder a campos de miembros privados no estáticos en su propia clase. El siguiente código es perfectamente válido y muestra un método estático para acceder a un campo privado:
public class Foo
{
private bool _field;
public static bool GetField(Foo foo)
{
return foo._field;
}
}
Ahora ... volver a su pregunta. Se podría pensar que un método de extensión debería ser capaz de hacer lo mismo, dada la "equivalencia" (inexistente) con los métodos estáticos que existen otras respuestas. Sin embargo, no puede declarar métodos de extensión dentro de una clase anidada. Así que si usted trata de hacer lo siguiente:
public class Foo
{
private bool _field;
public static class Extensions
{
public static bool GetField(this Foo foo)
{
return foo._field;
}
}
}
Cuando conteste diciendo un error de compilación
método de extensión debe ser definido en una clase estática nivel superior; Extensiones es una clase anidada
Tenga en cuenta que, curiosamente, eliminar la palabra clave this
hace que el código compile bien. Las razones de esto se discuten aquí:
excelencia en ingeniería. – Fattie
Si usted es dueño de la clase que se está extendiendo, que una siempre declaran la clase parcial, a continuación, extender la clase & tienen acceso a todos los miembros privados en un archivo diferente ... Pero realmente no estarías usando métodos de extensión.
utilizar la reflexión
no se recomienda, pero lo que pueda acceder a cualquier variable privada de cualquier tipo utilizando otro método de extensión de este 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);
}
y luego acceder a un campo privado de un tipo arbitrario:
Foo foo = new Foo();
string privateBar = foo.GetFieldValue<string>("_bar");
- 1. métodos estáticos Java que acceden variables privadas
- 2. C Variables privadas Obtener y establecer métodos
- 3. C++: el acceso a los métodos de padres y variables
- 4. Patrón de módulo de JavaScript: ¿Cómo acceden los métodos privados al alcance del módulo?
- 5. ¿Los métodos LINQ son métodos de extensión?
- 6. C# para las variables miembro privadas
- 7. Reemplazando los métodos de extensión
- 8. C# métodos de extensión ambiguos
- 9. variables privadas o protegidas?
- 10. métodos de extensión estáticas
- 11. equivalente de Scala de los métodos de extensión de C#?
- 12. Clases externas que acceden a métodos privados del paquete
- 13. ¿Cómo se compilan los métodos de extensión?
- 14. ¿Cómo extiendo una clase con los métodos de extensión C#?
- 15. por qué los métodos de extensión en C# Class Libraries
- 16. Variables privadas en prototipos heredados
- 17. C# Métodos de extensión - devolver llamada objeto
- 18. force get/set acceso de variables privadas para propiedades privadas
- 19. C#: operador implícito y métodos de extensión
- 20. simular variables privadas en Python
- 21. Métodos de extensión de encadenamiento en C#
- 22. ¿Los métodos de extensión ocultan las dependencias?
- 23. Cómo se conectan los métodos de extensión
- 24. C# utilizando params y métodos de extensión
- 25. Mejores prácticas: C# Espacio de nombres de métodos de extensión y promoción de métodos de extensión
- 26. ¿Cuándo deberían evitarse los métodos de extensión?
- 27. C# Métodos de extensión - patrones de diseño
- 28. Funciones privadas y variables ExtJs4?
- 29. Llamada a método ambigiuous entre los métodos de extensión
- 30. variables estáticas en los métodos de Objective-C
+1. Como un aparte, puede tener métodos de extensión privados; hay un buen artículo sobre esto en http://odetocode.com/Blogs/scott/archive/2009/10/05/private-extension-methods.aspx. Los métodos de extensión también pueden acceder a miembros privados estáticos de su clase de utilidad estática. – TrueWill
Aunque está etiquetado como C#, esto se aplica a cualquiera de los lenguajes .NET que brindan soporte para los métodos de extensión. –
@TrueWill - pero dado que deben ser tipos estáticos, no anidados y no genéricos, no pueden tener acceso privado a las variables * de ningún objeto *. acceso 'interno', seguro, pero no 'privado'. –