如何在调用特定构造函数时使用反射创建下面类型的实例?检查了Activator.CreateInstance的所有重载,但认为没有匹配。 在下面的示例中,我希望在创建SomeType实例后将x加倍,即,我希望调用构造函数来调用ref int版本。
另外,MS如何为CreatInstance方法定义“最佳匹配”算法?
internal sealed class SomeType
{
//consturctor with non-reference parameter
public SomeType(int x)
{
x *= 3;
}
//constructor with reference parameter
public SomeType(ref int x)
{
x *= 2;
}
}
class Program
{
private static void main()
{
var param = new object[] {4}; // constructor parameter
Console.WriteLine("Param Before consturctor called: " + param[0]);
Object instance = Activator.CreateInstance(typeof(SomeType), param);
Console.WriteLine("Param after constuctor called: " + param[0]);
}
}
答案 0 :(得分:1)
为了匹配ref int x
参数,您可以使用Type.GetConstructor
创建实例,并将System.Int32&
作为参数传递:
var ctor = typeof(SomeType).GetConstructor(new[] { Type.GetType("System.Int32&") });
var constructorParameters = new object[] { 1 };
SomeType someType = (SomeType)ctor.Invoke(constructorParameters);
修改强>
正如@mikez建议的那样,使用typeof(int).MakeByRefType()
代替System.Int32&
更好:
var ctor = typeof(SomeType).GetConstructor(new[] { typeof(int).MakeByRefType(); });
var constructorParameters = new object[] { 1 };
SomeType someType = (SomeType)ctor.Invoke(constructorParameters);