Делегат к Действию <касательно T1, T2>

Я пытаюсь создать делегата статического метода, который берет касательно аргумента. Не спрашивайте, почему я делаю такую абсурдную вещь. Это - вся часть изучения, как .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)}

Я тогда пытался использовать касательно ключевого слова в Действии:

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

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

Что правильный путь состоит в том, чтобы создать этого делегата?

29
задан Max Yaffe 8 January 2010 в 19:54
поделиться

2 ответа

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

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

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

39
ответ дан 28 November 2019 в 01:18
поделиться

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

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

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

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

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

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

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.
23
ответ дан 28 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: