C# 如何使用Activator.CreateInstance来反映其构造函数参数仅因ref而不同的类型

C# 如何使用Activator.CreateInstance来反映其构造函数参数仅因ref而不同的类型,c#,reflection,C#,Reflection,如何在调用特定构造函数时使用反射创建以下类型的实例?已检查Activator.CreateInstance的所有重载,但不认为存在与此匹配的重载。 在下面的示例中,我希望在创建SomeType的实例后x加倍,也就是说,我希望调用采用ref int版本的构造函数 另外,MS如何定义CreatInstance方法的“最佳匹配”算法 internal sealed class SomeType { //consturctor with non-reference parameter

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

为了匹配
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);

所以在这种情况下就不可能再使用Activator.CreateInstance了?我查了一下,发现没有合适的重载来接受参数类型。所以我假设这是不可能的。请注意,
typeof(int).MakeByRefType()
是一种创建
ref
类型的方法,如果您不想将类型名放在字符串中,比如
type.GetType(“System.Int32&”)
@mikez谢谢,我不知道。编辑了我的答案,“MS是如何定义的…”它没有
Activator.CreateInstance
很方便,但几乎字面意思是“让我成为一个对象,我不在乎如何”。也不是很快。。。所以,如果您知道要调用某个特定的构造函数,通常最好直接调用。@jeroenmoster,不是吗?我的意思是,当有多个基于某个东西的潜在匹配时,它必须找到一个构造函数匹配。这就是为什么MS说CreateInstance将尝试根据“最佳匹配”查找匹配。我的意思是“MS没有确切定义“最佳匹配”的含义”。@Jeroenmoster好的,谢谢您提供的信息。