Как использовать Activator.CreateInstance для отражения типа, чей параметр конструктора отличается только на ref

1

Как использовать отражение для создания экземпляра типа ниже при вызове конкретного конструктора? Проверял все перегрузки 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]);
     }
}
  • 0
    «Как MS определяет ...» Это не так. Activator.CreateInstance удобен, но почти буквально означает «сделай меня объектом, и мне все равно, как». Это тоже не совсем быстро ... поэтому, если вы знаете, что хотите вызвать определенный конструктор, обычно лучше сделать это напрямую.
  • 0
    @JeroenMostert это не так? Я имею в виду, что он должен найти совпадение конструктора, когда существует более одного потенциального совпадения, основанного на чем-то. Вот почему MS сказала, что CreateInstance попытается найти совпадение на основе «лучшего совпадения».
Показать ещё 2 комментария
Теги:
reflection

1 ответ

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);
  • 0
    То есть больше нельзя использовать Activator.CreateInstance в такой ситуации?
  • 0
    Я искал это, я не вижу надлежащей перегрузки, которая принимает типы параметров. Так что я предполагаю, что это невозможно.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню