C#扩展方法可以访问私有variables吗?

是否有可能使用扩展方法访问对象的私有variables?

不可以。在某些实用程序类中,您可以在扩展方法中执行与“常规”静态方法相同的操作。

所以这个扩展方法

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

相当于这样的一些静态辅助方法(至less在你可以访问什么的情况下):

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

(当然,你可以用任何一种方法来访问私人成员,但我想这不是问题的关键)。

不,它不能。

但是,您将有兴趣知道其他答案不正确的说,正常的静态方法不能访问私人领域。 静态方法可以访问它自己的类中的私有非静态成员字段。 以下代码是完全有效的,并显示访问私有字段的静态方法:

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

现在…回到你的问题。 你可能会认为一个扩展方法应该能够做同样的事情,因为(不存在的)“等价”静态方法,其他答案声称存在。 但是,您不能在嵌套类中声明扩展方法。 所以如果你尝试做下面的事情:

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

你会得到一个编译错误说

扩展方法必须在顶级静态类中定义; 扩展是一个嵌套的类

请注意,有趣的是,删除this关键字会导致代码编译正常。 这里讨论的原因如下:

  1. 为什么扩展方法只允许在非嵌套的非generics静态类中使用?
  2. 为什么不允许在嵌套类中使用扩展方法定义?

没有:

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

不,除非您通过公共财产或代理模式给予某种访问权限。

如果你拥有你正在扩展的类,你总是声明类部分,然后扩展类和访问所有私人成员在一个不同的文件…但你不会真的在使用扩展方法。

一个扩展方法本质上是一个静态方法,所以你有权访问的是在其上调用扩展方法的实例的公共成员

不推荐,但你可以使用另一种扩展方法访问任何types的私有variables,如:

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

然后访问任意types的私有字段:

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