Делегат для действия <ref T1, T2> - PullRequest
29 голосов
/ 08 января 2010

Я пытаюсь создать делегат статического метода, который принимает аргумент ref. Пожалуйста, не спрашивайте, почему я делаю такую ​​глупую вещь. Это все часть изучения того, как .Net, C # и рефлексия работают и как их оптимизировать.

Мой код:

    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 в действии:

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

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

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

Ответы [ 2 ]

38 голосов
/ 08 января 2010

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

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

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

23 голосов
/ 08 января 2010

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

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

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

Теоретически, "это по ссылке или нет" является частью информации о типе (следовательно, Type.IsByRef), но вы не можете указать это так.

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

РЕДАКТИРОВАТЬ: Я только что попробовал:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...