Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中为具有私有构造函数的类创建私有对象#_C# - Fatal编程技术网

C# 在c中为具有私有构造函数的类创建私有对象#

C# 在c中为具有私有构造函数的类创建私有对象#,c#,C#,我想访问一个构造函数定义为private的类的一些私有成员。如何为此类创建PrivateObject,以便访问其私有成员 我尝试了类似的方法,但我无法实例化类“MyClass1”,因此无法实例化PrivateObject MyClass1 myClass = new MyClass1(); //gives compilation error PrivateObject po = new PrivateObject(myClass); //gives compilation err

我想访问一个构造函数定义为private的类的一些私有成员。如何为此类创建PrivateObject,以便访问其私有成员

我尝试了类似的方法,但我无法实例化类“MyClass1”,因此无法实例化PrivateObject

    MyClass1 myClass = new MyClass1(); //gives compilation error
    PrivateObject po = new PrivateObject(myClass); //gives compilation error

有什么解决方法吗?

带有私有构造函数的类只能从自己的静态方法创建自己。例如:

class MyClass1
{
    private MyClass1()
    {

    }

    public static MyClass1 CreateInstance()
    {
        return new MyClass1();
    }
}
它的私有成员(如字段或属性)总是只能从类内部访问(除非您使用反射进行一些技巧)。如果该字段受保护,则可以通过从此类派生来访问它。所有其他方式都是通过设计来限制对这些字段的访问,您不应该尝试从外部访问它们

编辑:现在我注意到您使用PrivateObject类,该类是为进行上述反射欺骗而创建的。所以现在您只需要创建实例。您应该检查初始化这个对象的设计方法是什么,可能是通过一些静态方法


或者查看此链接,了解更多关于reflaction和Activator的黑客行为:

您可能根本不应该这样做,但如果您有很好的理由,请尝试通过反射获取构造函数:您只能从类本身内部访问类的私有成员。如果无法修改类的源代码,则无法更改私有变量。@BenjaminHodgson PrivateObject是一种执行必要的反射工作以访问私有成员的类型。看@BrianRasmussen,那是作弊;)<代码>var myClass=(MyClass1)Activator.CreateInstance(typeof(MyClass1),true)