C# 代表一项行动<;参考T1、T2>;

C# 代表一项行动<;参考T1、T2>;,c#,reflection,delegates,C#,Reflection,Delegates,我试图创建一个静态方法的委托,该方法使用ref参数。请不要问我为什么要做这种愚蠢的事。这都是学习.Net、C#和反射如何工作以及如何优化它的一部分 我的代码是: public struct DataRow { private double t; static public void Cram_T(ref DataRow dr, double a_t) { dr.t = a_t; }

我试图创建一个静态方法的委托,该方法使用ref参数。请不要问我为什么要做这种愚蠢的事。这都是学习.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>;
然后我尝试在操作中使用ref关键字:

  var myCram_T_Delegate = 
         Delegate.CreateDelegate(typeof(Action<ref DataRow, Double>),         
                                 my_Cram_T_Method) 
                                 as Action<ref DataRow, Double>;
var myCram\u T\u委托=
Delegate.CreateDelegate(类型(操作),
我的方法)
作为行动;
但这不会编译。C#编译器在标记“ref”处阻塞


创建此委托的正确方法是什么?

创建自己的委托类型:

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

并使用
MyAction
代替
Action
——正如您所指出的,它不会编译。

@Ben M的想法是正确的,尽管您可以让它更通用:

public delegate void RefAction<T1, T2>(ref T1 arg1, T2 arg2)
抛出一个错误:

Unhandled Exception: System.ArgumentException: The type 'System.Int32&' may
not be used as a type argument.

类型参数必须是其值可转换为对象的类型。托管指针类型和非托管指针类型都不满足这个要求。我从来没有这样做过。迷人的。这一次,我认为不值得在C#Depth中包含这一点。也许作为一个注释…这是有效的,但列表注释是不相关的。公共代表无效引用(引用T1 arg1、T2 arg2);var myCram_TDelegate=Delegate.CreateDelegate(typeof(RefGenAction),myType.GetMethod(“Cram_T”))作为RefGenAction@马克斯·亚夫:列表评论在什么方面是无关紧要的?它指出,无论是否用于委托,您都不能将“ref Foo”用作泛型类型参数。VB.NET等效程序向类型T1添加类型约束:
公共委托子重构(T1为类,T2)(ByRef arg1为T1,ByVal arg2为T2)
,这给内部方法带来了限制。这些限制是什么?
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.