C#-重写学员行动要求<&燃气轮机;
我需要用预处理这些函数的输入数据的代码来包装许多函数(“包装器”)。下面是使用委托编写的代码(代码尽可能简化,同时仍然可以正常运行并立即编译): 现在,为了简化代码,我想使用动作语法重写它,并内联函数的代码。以下是我试图做的,但我无法编写正确且运行正常的程序:C#-重写学员行动要求<&燃气轮机;,c#,lambda,delegates,anonymous-function,C#,Lambda,Delegates,Anonymous Function,我需要用预处理这些函数的输入数据的代码来包装许多函数(“包装器”)。下面是使用委托编写的代码(代码尽可能简化,同时仍然可以正常运行并立即编译): 现在,为了简化代码,我想使用动作语法重写它,并内联函数的代码。以下是我试图做的,但我无法编写正确且运行正常的程序: using System; namespace ConsoleApp { class ClientContext { public int i = 1; } class SPRemote
using System;
namespace ConsoleApp
{
class ClientContext
{
public int i = 1;
}
class SPRemoteEventProperties
{
}
class Program
{
Action<ClientContext, SPRemoteEventProperties> Act;
// error in next line =>
public static void Wrapper(Act f, ClientContext clientContext, SPRemoteEventProperties properties)
{
ClientContext newClientContext = new ClientContext
{
i = clientContext.i * 2
};
f(newClientContext, properties);
}
static void Main(string[] args)
{
Function1(new ClientContext(), new SPRemoteEventProperties());
Function2(new ClientContext(), new SPRemoteEventProperties());
// error in next 2 lines =>
Wrapper((new ClientContext(), new SPRemoteEventProperties()) => Console.WriteLine("Function1: " + clientContext.i));
Wrapper((new ClientContext(), new SPRemoteEventProperties()) => Console.WriteLine("Function2: " + clientContext.i));
Console.Read();
}
static void Function1(ClientContext clientContext, SPRemoteEventProperties properties)
{
Console.WriteLine("Function1: " + clientContext.i);
}
static void Function2(ClientContext clientContext, SPRemoteEventProperties properties)
{
Console.WriteLine("Function2: " + clientContext.i);
}
}
}
使用系统;
名称空间控制台
{
类ClientContext
{
公共int i=1;
}
类SPRemoteEventProperties
{
}
班级计划
{
行动法;
//下一行中的错误=>
公共静态void包装器(Act f、ClientContext、ClientContext、SPRemoteEventProperties属性)
{
ClientContext newClientContext=新ClientContext
{
i=clientContext.i*2
};
f(newClientContext,属性);
}
静态void Main(字符串[]参数)
{
函数1(新的ClientContext(),新的spremoteventproperties());
函数2(新的ClientContext(),新的spremoteventproperties());
//下两行中出现错误=>
包装器((new ClientContext(),new spremoteventproperties())=>Console.WriteLine(“Function1:+ClientContext.i”);
包装器((new ClientContext(),new SPRemoteEventProperties())=>Console.WriteLine(“函数2:+ClientContext.i”);
Console.Read();
}
静态void函数1(ClientContext ClientContext、SPRemoteEventProperties属性)
{
Console.WriteLine(“Function1:+clientContext.i”);
}
静态void函数2(ClientContext ClientContext、SPRemoteEventProperties属性)
{
Console.WriteLine(“Function2:+clientContext.i”);
}
}
}
您能帮我更正此代码吗?操作的用法与代理不同:
delegate
语法定义了一个类型声明,您可以使用它来定义变量,而Action
语法已经是该类型,您可以使用它来创建变量。我不确定我是否清楚,但以下是正确的语法:
publicstaticvoidwrapper(操作f,ClientCo。。。
我不确定我是否完全理解您的意图,我接近了吗
public static void Wrapper(ClientContext clientContext, SPRemoteEventProperties properties, Action<ClientContext, SPRemoteEventProperties> action)
{
action(newClientContext, properties);
}
...
Wrapper( new ClientContext(), new SPRemoteEventProperties(),(context, properties) => Console.WriteLine("Function1: " + context.i));
publicstaticvoidwrapper(ClientContext-ClientContext,spremoteventproperties属性,Action-Action)
{
操作(newClientContext、属性);
}
...
包装器(new ClientContext(),new spremoteventproperties(),(context,properties)=>Console.WriteLine(“Function1:+context.i”);
一个动作
有菱形符号(
)与委托
不同,它包含编译器使其类型安全所需的所有内容。这不同于委托
,它在定义特定委托之前不是真正类型化的,它告诉编译器所有参数的类型。使用操作
只需我要把这些字体放进钻石里,瞧,现在已经是一个完整的字体了
由于参数名称前始终有其类型,因此原型应如下所示:
public static void Wrapper(Action<ClientContext, SPRemoteEventProperties> f, ClientContext clientContext, SPRemoteEventProperties properties)
{
publicstaticvoidwrapper(操作f、ClientContext、ClientContext、spremoteventproperties属性)
{
这就是编译器需要知道的关于该参数中包含的内容的所有信息,请按类型进行。尝试在包装器中传递Action f
参数,而不是Act f
您正在用另一个委托类型替换一个委托类型。以前的委托类型是Del
。新的委托类型是Action
>。因此,只需将一个替换为另一个(您只在一个位置使用它),并删除Del
type,因为它不再需要。Action Act;
不是类型定义。但您确实尝试使用它。Action f…作为包装器的第一个参数解决了第一个错误。是的,这解决了内联语法部分。谢谢!
public static void Wrapper(ClientContext clientContext, SPRemoteEventProperties properties, Action<ClientContext, SPRemoteEventProperties> action)
{
action(newClientContext, properties);
}
...
Wrapper( new ClientContext(), new SPRemoteEventProperties(),(context, properties) => Console.WriteLine("Function1: " + context.i));
public static void Wrapper(Action<ClientContext, SPRemoteEventProperties> f, ClientContext clientContext, SPRemoteEventProperties properties)
{