Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#约束:void Do(Action<;T>;Action),其中Action:static?_C#_Static_Constraints - Fatal编程技术网

c#约束:void Do(Action<;T>;Action),其中Action:static?

c#约束:void Do(Action<;T>;Action),其中Action:static?,c#,static,constraints,C#,Static,Constraints,因此,我想序列化操作(或其他强类型委托或任务)的列表。我发现了几个链接,它们提供了一些关于序列化匿名委托和使用BinaryFormatter序列化操作的见解,但我发现只有当操作标记为静态,或者它们的声明类型标记为可序列化时,这才有效,而我将那些声明对象序列化。我什么都不需要对象状态,只需要对静态方法的引用,所以 如何将操作约束为仅其中操作:静态?在运行时,您可以检查委托.目标;如果为null,则委托没有绑定参数。还可以使用Delegate.CreateDelegate(type,firstArg

因此,我想序列化
操作
(或其他强类型委托或任务)的列表。我发现了几个链接,它们提供了一些关于序列化匿名委托和使用
BinaryFormatter
序列化
操作
的见解,但我发现只有当
操作
标记为静态,或者它们的声明类型标记为可序列化时,这才有效,而我将那些声明对象序列化。我什么都不需要对象状态,只需要对静态方法的引用,所以


如何将
操作
约束为仅
其中操作:静态

在运行时,您可以检查
委托.目标
;如果为null,则委托没有绑定参数。还可以使用
Delegate.CreateDelegate(type,firstArgument,method)
为具有目标的委托创建自定义序列化系统,以重新创建它们,但我建议不要使用任何委托序列化,因为这将导致脆弱的代码。这种约束并不存在,正如前面所指出的那样。可以使用delgate的Method.IsStatic属性进行运行时检查。然而,即使只是运行时检查也有一些限制。在C#6中,编译器将生成一个不可序列化的闭包类,其中包含lambdas的实例方法和不包含任何闭包变量的匿名方法。这将导致常见用例的运行时检查失败。