Как использовать отражение для создания экземпляра типа ниже при вызове конкретного конструктора? Проверял все перегрузки Activator.CreateInstance, но не думаю, что для этого есть соответствие. В приведенном ниже примере я хочу, чтобы x был удвоен после создания экземпляра SomeType, а именно, я хочу, чтобы конструктор, который вызывал 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
удобен, но почти буквально означает «сделай меня объектом, и мне все равно, как». Это тоже не совсем быстро ... поэтому, если вы знаете, что хотите вызвать определенный конструктор, обычно лучше сделать это напрямую.