Délégué pour l'Action< ref T1, T2>
Je suis en train de créer un délégué d'une méthode statique qui prend un argument ref. S'il vous plaît ne me demandez pas pourquoi je suis en train de faire une telle cockamamie chose. Tout cela fait partie de l'apprentissage de la manière .Net, C#, et de réflexion, de travail et comment l'optimiser.
Mon code est:
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>;
Cela me donne une liaison erreur de parce que (je pense) pour le générique de l'action ne correspond pas à la méthode.
L'inspection de la valeur de Cram_T_Method dans la fenêtre watch donne
{Void Cram_T(DataRow ByRef, Double)}
J'ai ensuite essayé d'utiliser le mot-clé ref dans l'Action:
var myCram_T_Delegate =
Delegate.CreateDelegate(typeof(Action<ref DataRow, Double>),
my_Cram_T_Method)
as Action<ref DataRow, Double>;
Mais ce ne sera pas compilé. Le compilateur C# étouffe au le jeton "ref".
Quelle est la bonne façon de créer ce délégué?
Vous devez vous connecter pour publier un commentaire.
Créer votre propre type de délégué:
Et l'utilisation
MyAction
en place deAction<ref DataRow, Double>
-- qui est, comme vous l'avez remarqué, il n'est pas compilé.@Ben M a la bonne idée, même si on pourrait le rendre plus générique:
Le problème n'a rien à voir avec les délégués en tant que tel - c'est juste que vous ne pouvez pas utiliser
ref
lorsque vous spécifiez un argument de type.Dans la théorie de la "il est par des ref ou pas", fait partie de la nature de l'information (d'où
Type.IsByRef
), mais vous ne pouvez pas spécifier comme ça.Franchement, je ne suis pas du tout sûr de ce qui se passerait si vous avez essayé de créer un
List<ref int>
par la réflexion, par exemple - je espère qu'une exception sera levée... c'est pas très sensible concept 🙂EDIT: je l'ai juste essayé:
Renvoie une erreur:
Public Delegate Sub RefAction(Of T1 As Class, T2)(ByRef arg1 As T1, ByVal arg2 As T2)