Activator.CreateInstance 用于创建 Ironpython class
Activator.CreateInstance for create Ironpython class
是否可以使用 Activator.CreateInstance
根据 Ironpython 中声明的类型在 c# 中创建 class?如果我尝试使用它,我总是会收到消息,即找不到无参数构造函数。
谢谢!
假设您使用 Activator.CreateInstance
的重载只接受 Type
参数,您的 class 必须有一个接受 零参数的构造函数。
如果您坚持使用仅接受 Type
参数的 Activator.CreateInstance
重载,而不是例如 overload that takes a collection of objects as args
,那么您必须实现无参数构造函数。
示例:
public class MyClass
{
public MyClass() // <-- parameterless constructor
{
}
}
如果 class 不是您代码的一部分,或者在您无法控制源代码的库中。那么你也许可以继承 class,前提是基础 class 不是 sealed
,然后将 parameterless constructor
添加到派生的 class.
示例:
public class MyClass : SomeBaseClassYouDontControl
{
public MyClass() : base(null) // <-- still a parameterless constructor
{
}
}
但是,我 建议反对 使用 Activator.CreateInstance
因为它的性能很糟糕,现在比以前版本的 C# / .NET 好一点。 @SchlaWiener 的回答包含更多关于此的信息。
这个问题,可能也与你的问题有关。 Activator.CreateInstance Performance Alternative
Activator.CreateInstance 有很多重载。您应该使用需要类型的重载和属性的附加对象数组
您可以创建此 class
的实例
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
...
简短的回答,不,这是不可能的。
是否可以使用 Activator.CreateInstance
根据 Ironpython 中声明的类型在 c# 中创建 class?如果我尝试使用它,我总是会收到消息,即找不到无参数构造函数。
谢谢!
假设您使用 Activator.CreateInstance
的重载只接受 Type
参数,您的 class 必须有一个接受 零参数的构造函数。
如果您坚持使用仅接受 Type
参数的 Activator.CreateInstance
重载,而不是例如 overload that takes a collection of objects as args
,那么您必须实现无参数构造函数。
示例:
public class MyClass
{
public MyClass() // <-- parameterless constructor
{
}
}
如果 class 不是您代码的一部分,或者在您无法控制源代码的库中。那么你也许可以继承 class,前提是基础 class 不是 sealed
,然后将 parameterless constructor
添加到派生的 class.
示例:
public class MyClass : SomeBaseClassYouDontControl
{
public MyClass() : base(null) // <-- still a parameterless constructor
{
}
}
但是,我 建议反对 使用 Activator.CreateInstance
因为它的性能很糟糕,现在比以前版本的 C# / .NET 好一点。 @SchlaWiener 的回答包含更多关于此的信息。
这个问题,可能也与你的问题有关。 Activator.CreateInstance Performance Alternative
Activator.CreateInstance 有很多重载。您应该使用需要类型的重载和属性的附加对象数组
您可以创建此 class
的实例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
...
简短的回答,不,这是不可能的。