C# 如何使用Activator.CreateInstance来反映其构造函数参数仅因ref而不同的类型
如何在调用特定构造函数时使用反射创建以下类型的实例?已检查Activator.CreateInstance的所有重载,但不认为存在与此匹配的重载。 在下面的示例中,我希望在创建SomeType的实例后x加倍,也就是说,我希望调用采用ref int版本的构造函数 另外,MS如何定义CreatInstance方法的“最佳匹配”算法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
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好的,谢谢您提供的信息。