【发布时间】:2018-03-14 07:58:48
【问题描述】:
我需要用可以预处理这些函数的输入数据的代码(“Wrapper”)来包装一些函数。以下是使用委托编写的代码(代码已尽可能简化,同时仍可正常运行且可立即编译):
namespace ConsoleApp
{
class ClientContext
{
public int i = 1;
}
class SPRemoteEventProperties
{
}
class Program
{
public delegate void Del(ClientContext clientContext, SPRemoteEventProperties properties);
public static void Wrapper(Del 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());
Wrapper(Function1, new ClientContext(), new SPRemoteEventProperties());
Wrapper(Function2, new ClientContext(), new SPRemoteEventProperties());
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);
}
}
}
现在,为了简化代码,我想使用 Action 语法重写它并内联函数的代码。这是我尝试做的,但我无法编写一个正确且正常运行的程序:
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);
}
}
}
你能帮我更正这段代码吗?
【问题讨论】:
-
尝试在
Wrapper参数中传递Action<ClientContext, SPRemoteEventProperties> f而不是Act f -
您正在将一种委托类型替换为另一种。以前的委托类型是
Del。新的委托类型是Action<ClientContext, SPRemoteEventProperties>。因此,只需将一种用法替换为另一种(您只在一个地方使用它),然后删除Del类型,因为它不再需要了。 -
Action<ClientContext, SPRemoteEventProperties> Act;不是类型定义。但是您确实尝试使用它。 -
Action
f ... 作为 Wrapper 的第一个参数解决了第一个错误。
标签: c# lambda delegates anonymous-function