访问另一个类的受保护成员

use*_*556 1 c# class access-modifiers friend

我有一个类 A,我需要从中访问类 B 的受保护成员,其方式与在 C++ 中使用朋友关键字的方式相同。但是,内部修饰符不适合我的需要。B 类将需要创建 A 类的实例,修改其私有数据,并返回对该类的引用。这些 A 类成员需要对原始调用者保持私有。

public class A
{
    protected int x;
}

public class B
{
    public static A CreateClassA()
    {
        A x = new A();
        x.x = 5;   // ERROR : No privilege
        return x;
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

您可以使用protected internal而不是internal授予对同一程序集中的所有类以及其他程序集中的子类的访问权限:

public class A
{
    protected internal int x;
}

public class B
{
    public static A CreateClassA()
    {
        A x = new A();
        x.x = 5;   // hurray
        return x;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jos*_*ech 5

这个问题在这一点上有点老了,但这是另一种方法,做你问的,没有讲座或手指摇摆:

考虑:

A foo = new A();
FieldInfo privateField = foo.GetType().GetField("x", BindingFlags.NonPublic | BindingFlags.Instance);
privateField.SetValue(foo, 5);
Run Code Online (Sandbox Code Playgroud)

警告:使用上述代码会破坏封装,弯曲您的脊椎,并且可能会因 OO 纯粹主义者的尖锐尖叫而导致耳朵损伤。

...但它适用于工厂类,弥补了 C# 缺少朋友关键字的问题。

警告 2:这很慢。