是否可以使用Activator.CreateInstance
根据Ironpython中声明的Type在c#中创建一个类?如果我尝试使用它,我总是得到消息,没有找到无参数构造函数。
谢谢!
答案 0 :(得分:1)
Activator.CreateInstance有很多重载。您应该使用需要Type和adition对象数组的重载来实现属性
您可以创建此类的实例
public class MyClass
{
public MyClass(int _int, string _string, bool _bool)
{
}
}
与
Activator.CreateInstance(typeof(MyClass), new object[] { 1, "string", true });
正如die maus
所说,与其他解决方案相比,Activator.CreateInstance可能会很慢。但这完全取决于你想做什么。如果您想构建依赖注入框架,我建议您使用替代方法。如果你想在运行时创建一个类型,如果需要3或15毫秒就没关系,你应该没问题。
我写了一个快速基准:
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
for (int i = 0; i < 100000; i++)
{
var file = new System.IO.FileInfo(@"c:\temp\file");
}
var t1 = sw.ElapsedMilliseconds;
var args = new object [] { @"c:\temp\file" };
sw.Restart();
for (int i = 0; i < 100000; i++)
{
var file = Activator.CreateInstance(typeof(System.IO.FileInfo), args);
}
var t2 = sw.ElapsedMilliseconds;
Console.WriteLine("t1: {0}", t1);
Console.WriteLine("t2: {0}", t2);
输出:
t1: 466
t2: 1246
在大多数情况下我都不会考虑这个huge
...
答案 1 :(得分:0)
答案简短,不可能。
答案 2 :(得分:-1)
假设你使用Activator.CreateInstance
的重载只接受Type
参数,你的类必须有一个带零参数的构造函数。
如果你坚持使用Activator.CreateInstance
的重载只接受Type
参数,而不是overload that takes a collection of objects as args
,那么你必须实现一个无参数的构造函数。
示例:
public class MyClass
{
public MyClass() // <-- parameterless constructor
{
}
}
如果该类不是您的代码的一部分,或者在您无法控制源代码的库中。然后,您可以继承该类,前提是基类不是sealed
,然后将parameterless constructor
添加到派生类中。
示例:
public class MyClass : SomeBaseClassYouDontControl
{
public MyClass() : base(null) // <-- still a parameterless constructor
{
}
}
但是,我会使用Activator.CreateInstance
建议,因为它的性能很差,现在比以前版本的C#/ .NET好一点。 @ SchlaWiener的答案包含更多有关此内容的信息。
这个问题也可能与您的问题有关。 Activator.CreateInstance Performance Alternative