Подтвердить что ты не робот

Делегировать для действия <ref T1, T2>

Я пытаюсь создать делегат статического метода, который принимает аргумент ref. Пожалуйста, не спрашивайте, почему я делаю такую ​​игрушку. Все это часть изучения того, как работают .NET, С# и размышления, и как оптимизировать его.

Мой код:

    public struct DataRow
    {

        private double t;
        static public void Cram_T(ref DataRow dr, double a_t)
        {
            dr.t = a_t;
        }
    }
 ''''
  Type myType = typeof(DataRow);
  MethodInfo my_Cram_T_Method = myType.GetMethod("Cram_T");
  var myCram_T_Delegate = 
         Delegate.CreateDelegate(typeof(Action<DataRow, Double>),      
                                 my_Cram_T_Method) 
                                 as Action<DataRow, Double>;

Это дает мне ошибку привязки, потому что (я думаю) общее действие не соответствует методу.

Проверка значения Cram_T_Method в окне просмотра дает

{Void Cram_T(DataRow ByRef, Double)}

Затем я попытался использовать ключевое слово ref в Action:

  var myCram_T_Delegate = 
         Delegate.CreateDelegate(typeof(Action<ref DataRow, Double>),         
                                 my_Cram_T_Method) 
                                 as Action<ref DataRow, Double>;

Но это не скомпилируется. Компилятор С# дросселирует в токене "ref".

Каков правильный способ создания этого делегата?

4b9b3361

Ответ 1

Создайте свой собственный тип делегата:

delegate void MyAction(ref DataRow dataRow, double doubleValue);

И используйте MyAction вместо Action<ref DataRow, Double> - который, как вы отметили, не компилируется.

Ответ 2

@Ben M имеет правильную идею, хотя вы можете сделать ее более общей:

public delegate void RefAction<T1, T2>(ref T1 arg1, T2 arg2)

Проблема не имеет ничего общего с делегатами как таковой - просто вы не можете использовать ref при указании аргумента типа.

В теории "it by ref или not" является частью информации о типе (следовательно, Type.IsByRef), но вы не можете указать его так.

Откровенно говоря, я совсем не уверен, что произойдет, если вы попытаетесь создать List<ref int> через отражение, например - я бы надеялся, что будет выбрано исключение... это не очень разумная концепция:)

EDIT: Я только что попробовал:

Type refInt = typeof(int).MakeByRefType();
Type refIntList = typeof(List<>).MakeGenericType(refInt);

Выдает сообщение об ошибке:

Unhandled Exception: System.ArgumentException: The type 'System.Int32&' may
not be used as a type argument.