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

C#扩展方法可以访问私有变量吗?,c#,extension-methods,C#,Extension Methods,是否可以使用扩展方法访问对象的私有变量?否。您可以在扩展方法中执行与在某些实用程序类中的“普通”静态方法相同的操作 所以这个扩展方法 public static void SomeMethod(this string s) { // do something with 's' } 相当于这样的静态帮助器方法(至少关于您可以访问的内容): (当然,您可以在任何一种方法中使用一些反射来访问私人成员。但我想这不是问题的重点。)否,除非您通过公共属性或代理模式授予他们某种访问权限。否: pub

是否可以使用扩展方法访问对象的私有变量?

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

所以这个扩展方法

public static void SomeMethod(this string s)
{
    // do something with 's'
}
相当于这样的静态帮助器方法(至少关于您可以访问的内容):


(当然,您可以在任何一种方法中使用一些反射来访问私人成员。但我想这不是问题的重点。)

否,除非您通过公共属性或代理模式授予他们某种访问权限。

否:

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

扩展方法本质上是一个静态方法,因此您可以访问的只是在其上调用扩展方法的实例的公共成员

但是,您会有兴趣知道,其他答案不正确,因为它们说普通静态方法无法访问私有字段静态方法可以访问自己类中的私有非静态成员字段。以下代码完全有效,并显示了访问私有字段的静态方法:

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
关键字会导致代码编译良好。这里讨论了产生这种情况的原因:


  • 如果您拥有要扩展的类,您可以始终声明该类为部分类,然后扩展该类并访问其他文件中的所有私有成员。。。但是您不会真正使用扩展方法。

    使用反射 不推荐,但您可以使用其他扩展方法访问任何类型的任何私有变量,如:

    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);
    }
    
    publicstatict GetFieldValue(此对象对象对象,字符串名称){
    var field=obj.GetType().GetField(名称,BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    返回(T)字段?.GetValue(obj);
    }
    
    然后访问任意类型的专用字段:

    Foo foo = new Foo();
    string privateBar = foo.GetFieldValue<string>("_bar");
    
    Foo-Foo=new-Foo();
    字符串privateBar=foo.GetFieldValue(“_-bar”);
    
    +1。另外,您可以使用私有扩展方法;关于这方面有一篇很好的文章,at扩展方法也可以访问其静态实用程序类的私有静态成员。尽管这被标记为C#,但这适用于任何支持扩展方法的.NET语言。@TrueWill-但由于它们必须是静态、非嵌套、非泛型类型,他们不能真正拥有对任何对象变量的私有访问权<代码>内部访问,当然-但不是
    私人
    -1我不理解这里的投票。。。这个答案很容易引起误解。普通的公共静态方法可以访问类内的私有方法,而扩展方法则不能。下面的代码是完全有效的,可以编译:公共类Foo{private bool\u variable;公共静态bool GetVariable(Foo Foo){return Foo.\u variable;}}}@ZaidMasud-它说它与“某个实用程序类中”的静态方法相同,而不是在同一个类中。这应该是首选答案。
    Foo foo = new Foo();
    string privateBar = foo.GetFieldValue<string>("_bar");