c# - when - Delegar para una acción<ref T1, T2>
uses of delegates in c# (2)
@Ben M tiene la idea correcta, aunque podrías hacerlo más genérico:
public delegate void RefAction<T1, T2>(ref T1 arg1, T2 arg2)
El problema no tiene nada que ver con los delegados como tales, sino que no se puede usar ref
cuando se especifica un argumento de tipo.
En teoría, "es por ref o no" es parte de la información de tipo (por Type.IsByRef
tanto, Type.IsByRef
) pero no se puede especificar así.
Francamente, no estoy del todo seguro de lo que pasaría si trataras de crear una List<ref int>
través de la reflexión, por ejemplo, esperaría que se lanzara una excepción ... no es un concepto muy sensato :)
EDITAR: Acabo de probarlo:
Type refInt = typeof(int).MakeByRefType();
Type refIntList = typeof(List<>).MakeGenericType(refInt);
Lanza un error:
Unhandled Exception: System.ArgumentException: The type ''System.Int32&'' may
not be used as a type argument.
Intento crear un delegado de un método estático que tome un argumento de ref. Por favor, no preguntes por qué estoy haciendo una cosa tan cacarea. Todo es parte de aprender cómo funciona .Net, C # y la reflexión y cómo optimizarla.
Mi código es:
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>;
Esto me da un error vinculante porque (creo) la acción genérica no coincide con el método.
La inspección del valor de Cram_T_Method en la ventana del reloj da
{Void Cram_T(DataRow ByRef, Double)}
Luego intenté usar la palabra clave ref en la Acción:
var myCram_T_Delegate =
Delegate.CreateDelegate(typeof(Action<ref DataRow, Double>),
my_Cram_T_Method)
as Action<ref DataRow, Double>;
Pero esto no compilará. El compilador C # se ahoga en el token "ref".
¿Cuál es la forma correcta de crear este delegado?
Crea tu propio tipo de delegado:
delegate void MyAction(ref DataRow dataRow, double doubleValue);
Y use MyAction
en lugar de Action<ref DataRow, Double>
- que, como ha notado, no compila.