如何使用Activator.CreateInstance来反映其构造函数参数仅由ref区分的类型

时间:2014-12-14 12:29:06

标签: c# reflection

如何在调用特定构造函数时使用反射创建下面类型的实例?检查了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]);
     }
}

1 个答案:

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