una son que programacion privado otra modificadores modificador metodos metodo los desde definicion cuales como clases clase acceso acceder c# extension-methods

son - public private protected c#



¿Pueden los métodos de extensión de C#acceder a variables privadas? (7)

¿Es posible acceder a las variables privadas de un objeto usando un método de extensión?


Use la reflexión

No recomendado, pero posiblemente podría acceder a cualquier variable privada de cualquier tipo usando otro método de extensión como este:

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 acceda a un campo privado de un tipo arbitrario:

Foo foo = new Foo(); string privateBar = foo.GetFieldValue<string>("_bar");


No, a menos que otorgue algún tipo de acceso a ellos a través de propiedades públicas o un patrón de proxy.


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 ... volviendo a tu 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. Entonces, si intenta hacer lo siguiente:

public class Foo { private bool _field; public static class Extensions { public static bool GetField(this Foo foo) { return foo._field; } } }

Obtendrá un error de compilación diciendo

El método de extensión se debe definir en una clase estática de nivel superior; Extensiones es una clase anidada

Tenga en cuenta que, curiosamente, la eliminación de this palabra clave hace que el código compile bien. Las razones para esto se discuten aquí:

  1. ¿Por qué los métodos de extensión solo se permiten en clases estáticas no genéricas y no anidadas?
  2. ¿Por qué no permitir la definición del método de extensión en la clase anidada?

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.

Entonces este método de extensión

public static void SomeMethod(this string s) { // do something with ''s'' }

es equivalente a un método de ayuda estático como este (al menos con respecto a lo que puede acceder):

public static void SomeStringMethod(string s) { // do something with ''s'' }

(Por supuesto, podría utilizar un reflejo en cualquiera de los métodos para acceder a miembros privados. Pero supongo que ese no es el punto de esta pregunta).


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; } }


Si posee la clase que está ampliando, siempre declara la clase parcial, luego amplíe la clase y tenga acceso a todos los miembros privados en un archivo diferente ... Pero realmente no estaría utilizando métodos de extensión.


Un método de extensión es esencialmente un método estático, por lo que todo lo que tiene acceso son los miembros públicos de la instancia en la que se invoca el método de extensión.