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