Ответ 1
Создайте свой собственный тип делегата:
delegate void MyAction(ref DataRow dataRow, double doubleValue);
И используйте MyAction
вместо Action<ref DataRow, Double>
- который, как вы отметили, не компилируется.
Я пытаюсь создать делегат статического метода, который принимает аргумент 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".
Каков правильный способ создания этого делегата?
Создайте свой собственный тип делегата:
delegate void MyAction(ref DataRow dataRow, double doubleValue);
И используйте MyAction
вместо Action<ref DataRow, Double>
- который, как вы отметили, не компилируется.
@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.