繁体   English   中英

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

[英]Activator.CreateInstance - How to create instances of classes that have parameterized constructors

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

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

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

有一个重载接受参数作为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);

我最终最终做了类似的事情 - 一些评论员无论如何都暗示了这个解决方案。

我基本上遍历了所有可用的构造函数并选择了最简单的构造函数。 然后我创建了空数据以传递到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());
}

我正在使用这种方法解决我遇到的问题 ,它似乎正如我希望的那样工作。 :)

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));

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

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

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

如何在Activator.CreateInstance中传递ctor args或使用IL?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM