Activator.CreateInstance - 如何创建具有参数化构造函数的类的实例

时间:2009-08-17 14:37:46

标签: c# .net .net-3.5

我已经在网上阅读了一些关于这个主题的内容,但发现没有一个对我有用。 我要做的是创建一个运行时类型的类。

我使用Activator.CreateInstance,它适用于包含不带参数的构造函数的类。对于那些有参数的人会引发异常,有没有办法解决这个问题呢?

我非常乐意将空值或空值传递给ctor,只要我可以自己创建类。

5 个答案:

答案 0 :(得分:47)

有一个重载接受作为params object[]的参数:

object obj = Activator.CreateInstance(typeof(StringBuilder), "abc");

会这样吗?或者,您可以使用反射来查找正确的构造函数:

Type[] argTypes = new Type[] {typeof(string)};
object[] argValues = new object[] {"abc"};
ConstructorInfo ctor = typeof(StringBuilder).GetConstructor(argTypes);
object obj = ctor.Invoke(argValues);

答案 1 :(得分:8)

我最终还是做了这样的事情 - 一些评论员总是暗示这个解决方案。

我基本上遍历了所有可用的构造函数并选择了最简单的构造函数。然后我创建了空数据以传递给ctor(因为我使用它来实现这种方法很好)

部分代码看起来有点像

// If we have a ctor that requires parameters then pass null values
if (requiresParameters)
{
    List<object> parameters = new List<object>();
    ParameterInfo[] pInfos = constructorInfos[0].GetParameters();

    foreach (ParameterInfo pi in pInfos)
    {
        parameters.Add(createType(pi.ParameterType));
    }

    return constructorInfos[0].Invoke(parameters.ToArray());
}

答案 2 :(得分:1)

我正在使用这种方法绕过an issue I ran into,它似乎正如我希望的那样工作。 :)

object instance = Activator.CreateInstance(
    typeof(OpCode),
    BindingFlags.NonPublic | BindingFlags.Instance,
    default(Binder),
    new object[] { stringname, pop, push, operand, type, size, s1, s2, ctrl, endsjmpblk, stack },
    default(CultureInfo));

答案 3 :(得分:0)

Activator.CreateInstance也有一大堆重载,你可能想要检查的是(Type type,params object [] args)。只需为此调用的第二个参数提供所需的构造函数参数。

确保你在这里处理异常,因为很容易传递不正确的参数或者稍后在类型的构造函数中更改某些东西会破坏它...

答案 4 :(得分:0)

作为Activator.CreateInstance的替代方案,链接网址中的FastObjectFactory比Activator更好(从.NET 4.0开始,明显优于.NET 3.5。没有使用.NET 4.5进行测试/统计)。有关统计信息,信息和代码,请参阅StackOverflow帖子。请注意,可能需要根据ctor参数的数量进行一些修改。提供的代码仅允许1 ctor param,但可以修改为超过1.请参阅代码中的注释。

How to pass ctor args in Activator.CreateInstance or use IL?