代码之家  ›  专栏  ›  技术社区  ›  Seb

没有无参数构造函数的类型的Activator.CreateInstance(类型)[duplicate]

  •  15
  • Seb  · 技术社区  · 16 年前

    [Serializable]
    public class A
    {
        private readonly string _name;
        private A(string name)
        {
            _name = name;
        }
    }
    

    在另一个集合中:

    public void f(Type t) {
        object o = Activator.CreateInstance(t);
    }
    

    f(typeof(A))

    此代码在.NET2.0下运行。

    [编辑]对不起,我误读了实际代码。。。我提供的例子没有说明这一点。我接受了约翰的回答,因为它提供了一个很好的信息。

    4 回复  |  直到 16 年前
        1
  •  12
  •   Community Mohan Dere    9 年前

    看这个: Creating instance of type without default constructor in C# using reflection

    展望未来,这与C#4.0有关:

    微软于2010年1月4日发布于 下午2:08
    我们已经检查了你的错误和 已经确定 存档此问题。感谢使用

    仅接受单个类型参数 建造师。采用 你的例子不是默认的 收件人:

    1. 使用接受参数数组的重载
    2. 传入类型。缺少参数
    3. 在BindingFlags中指定OptionalParamBinding

    举个例子:

    Activator.CreateInstance(typeof(MyClassName),
     BindingFlags.CreateInstance |
     BindingFlags.Public |
     BindingFlags.Instance |
     BindingFlags.OptionalParamBinding,
     null, new Object[] {Type.Missing}, null);
    

    谢谢,

    苏伟涛

        2
  •  29
  •   Marc Gravell    16 年前

    另一种选择是:

    object obj = System.Runtime.Serialization.FormatterServices
              .GetUninitializedObject(t);
    

    在内存中创建对象但是 不

        3
  •  0
  •   CWF    16 年前

    这样做可能不可行,但最简单的方法是在类型后面传递参数列表,如下所示:

    Activator.CreateInstance(t,“名称”);

    一种可能是在f()中有一个switch语句,它将正确的参数传递给类a的CreateInstance()。这不会扩展,但对你来说可能不是问题。

        4
  •  0
  •   Dan Tao    16 年前

    有两种令人困惑的味道 CreateInstance :需要一个 对象 类型 System.Type 参数 T .

    object Activator.CreateInstance(type As Type) { }
    

    第二个:

    T Activator.CreateInstance<T>() { }
    

    这个 一种是不适用于没有公共无参数构造函数的类。

    注意,即使使用第二个也几乎没有意义;在任何情况下,如果使用它,最好有一个 where T : new() 约束你的类并简单地使用 T

    MSDN documentation

    一般来说,这是没有用的 方法 因为类型必须在 可以使用语法( new 操作员输入 New 在Visual Basic中, gcnew 在里面

    编辑 :我可能说得太早了;看来第一个版本也不应该起作用。

    推荐文章