.net 如何在Silverlight中实例化一个只有私有无参数构造函数的类?

.net 如何在Silverlight中实例化一个只有私有无参数构造函数的类?,.net,silverlight,class,instantiation,.net,Silverlight,Class,Instantiation,我正在处理.NET测试数据生成器的功能请求。我需要能够实例化只有私有无参数构造函数的类 例如,我可能需要实例化以下类: public class MyClass() { private MyClass(){} } 对于大多数其他类,我使用以下代码: (T)Activator.CreateInstance(typeof(T), true) 但对于只有私有无参数构造函数的类,我使用以下方法: (T)FormatterServices.GetUninitializedObject(type

我正在处理.NET测试数据生成器的功能请求。我需要能够实例化只有私有无参数构造函数的类

例如,我可能需要实例化以下类:

public class MyClass()
{
    private MyClass(){}
}
对于大多数其他类,我使用以下代码:

(T)Activator.CreateInstance(typeof(T), true)
但对于只有私有无参数构造函数的类,我使用以下方法:

(T)FormatterServices.GetUninitializedObject(typeof(T))
public MyClass()
{
    int a;
    private MyClass(int a)
    {
        this.a = a;
    }
}
不幸的是,我还要求在Silverlight中执行此操作,不幸的是,Silverlight当前不包含System.Runtime.Serialization.FormatterServices


有人知道Silverlight实现中有什么东西可以让我绕过这个问题吗?如果做不到这一点,有人知道我如何实现这个方法的我自己的版本吗?

你不能从外部实例化这个类。想必它是经过精心设计的,所以您无法实例化它

我希望有一些获取实例的静态方法,比如单例属性或工厂方法。。。但是,如果你需要能够做到这一点与任何类型,这是行不通的


基本上,你需要重新思考你的设计——不要试图颠覆课程作者的意愿。

你可以使用反射来完成,但是

  • 你真的应该决定你做的事情是否正确。正如其他人所说,类的设计可能不是以这种方式实例化的。然而,我理解,在一些罕见的情况下,可能需要这样做

  • 您需要在完全信任的情况下运行此操作,即在浏览器之外运行。您不能在浏览器中执行此操作

代码如下:

var privateConstructors = typeof(MyClass).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var constr in privateConstructors)
{
    var obj = constr.Invoke(new object[0]);
    return;
}
throw new Exception("private constructor not found");

事实证明,答案就在我面前

如果您有一个定义如下的类:

public class MyClass
{
    private MyClass(){}
}
您可以使用我在问题中提到的以下代码对其进行实例化:

(T)Activator.CreateInstance(typeof(T), true)
附加参数true使用创建实例

结果证明,我一开始甚至不需要使用FormatterServices.GetUninitializedObject

然而,我要感谢Jon Skeet的回答,因为它帮助我质疑我的设计,并对Activator.CreateInstance进行了更深入的挖掘,增加了我对类实例化的理解

目前,我的解决方案是删除FormatterServices的使用,只允许在类型创建出现问题时引发异常

目前,据我所知,使用(T)Activator.CreateInstance(typeof(T),true),我应该能够构造我遇到的大多数类,除了以下几类:

(T)FormatterServices.GetUninitializedObject(typeof(T))
public MyClass()
{
    int a;
    private MyClass(int a)
    {
        this.a = a;
    }
}
然而,事实证明,有一种方法建议能够实例化这个类:

int argA = 100; 
Type type = typeof(MyClass);

ConstructorInfo c = type.GetConstructor(BindingFlags.NonPublic 
| BindingFlags.Instance, null, new Type[] { typeof(int) }, null);

MyClass o = (MyClass)c.Invoke(new Object[] { argA });

但是在考虑了Jon所说的话之后,我认为这对任何使用我正在增强的测试数据生成器的人都没有多大用处。如果有人费尽心机阻止类被实例化,那么除了通过类设计器提供的方法之外,可能不应该构造它。

这是针对一般的.Net类还是仅针对Silverlight?然而,虽然我同意我不会在普通生产代码中实例化类,但我的想法是,如果我正在创建的工具用于实例化单元测试中使用的简单poco对象,这应该是可以的。我将添加更多关于我试图实例化的类的详细信息,以防产生影响。@mezoid:一般来说。如果你开始做某个类的作者明确试图阻止你做的事情,你只会让事情出错。这一点很好!那么我应该避免使用FormatterServices.GetUninitializedObject吗?这种方法的主要用途是什么?MSDN对它的描述不是很详细…@mezoid:我相信它主要在内部用于序列化。我会避免它,除非你有一个非常特殊的目的,如序列化。谢谢你的回答堆乔恩,它真的帮助我质疑我的设计。事实证明,(T)Activator.CreateInstance(typeof(T),true)能够创建我需要的类。请看下面我的答案。。。