English 中文(简体)
通过反射在C#中创建类型实例时没有默认构造函数。
原标题:
  • 时间:2008-12-24 01:34:32
  •  标签:

以以下课程为例:

class Sometype
{
    int someValue;

    public Sometype(int someValue)
    {
        this.someValue = someValue;
    }
}

我随后想要使用反射创建该类型的实例:

Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);

通常,这将起作用,但是由于SomeType没有定义无参数构造函数,调用Activator.CreateInstance将抛出一个类型为MissingMethodException的异常,消息为“未为此对象定义无参数构造函数。”是否有替代方法仍然可以创建此类型的实例? 将无参数构造函数添加到我的所有类中可能有点糟糕。

最佳回答

我最初发布了这个答案(这里),但现在这里再次印刷一下,因为这不是完全相同的问题,但答案是一样的:

FormatterServices.GetUninitializedObject()将创建一个实例而不调用构造函数。 我使用Reflector并在一些核心的.Net序列化类中挖掘时找到了这个类。

我使用以下示例代码进行了测试,看起来它工作得很好:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Runtime.Serialization;

namespace NoConstructorThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = (MyClass)FormatterServices.GetUninitializedObject(typeof(MyClass)); //does not call ctor
            myClass.One = 1;
            Console.WriteLine(myClass.One); //write "1"
            Console.ReadKey();
        }
    }

    public class MyClass
    {
        public MyClass()
        {
            Console.WriteLine("MyClass ctor called.");
        }

        public int One
        {
            get;
            set;
        }
    }
}
问题回答

使用CreateInstance方法的此重载:

public static Object CreateInstance(
    Type type,
    params Object[] args
)

Creates an instance of the specified type using the constructor that best matches the specified parameters.

请查看:http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx

好的答案,但无法在dot net compact framework上使用。这里有一个在CF.Net上可行的解决方案...

class Test
{
    int _myInt;

    public Test(int myInt)
    {
        _myInt = myInt;
    }

    public override string ToString()
    {
        return "My int = " + _myInt.ToString();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var ctor = typeof(Test).GetConstructor(new Type[] { typeof(int) });
        var obj = ctor.Invoke(new object[] { 10 });
        Console.WriteLine(obj);
    }
}




相关问题
热门标签