如何将这两个方法转换为委托调用?

时间:2014-07-28 19:45:58

标签: c# delegates

我知道可以使用delagate完成以下操作。我不知道的是如何做到这一点。 我使用代表的经验很少。我为每种方法重构了具体的东西 将共享信息留在其中。

public void AddCustomer(UserReportSavePermissionRequest permissionRequest)
{
    var key = AddGroupName(permissionRequest.GroupName);
    var reportKey = AddCustomerSpecific(permissionRequest, key);
    AddPermission(permissionRequest, reportKey);
}

public void AddOnline(UserReportSavePermissionRequest permissionRequest)
{
    var key = AddGroupName(permissionRequest.GroupName);
    var reportKey = AddOnlineSpecific(permissionRequest, key);
    AddPermission(permissionRequest, reportKey);
}

我不确定如何实现这一目标。此外,我正在寻找一个关于代表的好教程来帮助我 更好地了解它们。

3 个答案:

答案 0 :(得分:2)

你没有解释为什么你希望这些代表成为代表,所以我假设你希望能够从其他类中调用这些方法。

创建与方法签名匹配的委托类型:

您的代表签名是没有返回值的签名和1个UserReportSavePermissionRequest类型的参数。因此,将此委托添加为公共委托,或者添加到Visual Studio

中的单独.cs文件中
public delegate void UserReportSavePermissionRequestDelegate(UserReportSavePermissionRequest);

现在让我们用它来调用实现此签名的两种方法之一:

//some code where you want to pass in a delegate so the delegated method can be called:
someObject.Register( this.AddCustomer);  // <-- you are passing a method that matches the delegate signature

someObject.Register()方法的定义如下:

public void Register(UserReportSavePermissionRequestDelegate del)
{
   ... //do some stuff
   var someVar  = CreateRequest(); // <-- this needs to be the UserReportSavePermissionRequest type
   del(someVar);
}

答案 1 :(得分:2)

假设AssociateCustomerReportsToGroupNameByAssociateOnlineReportsToGroupNameBy具有相同的签名,您可以通过传入与这两个方法具有相同签名的委托来消除公共代码的重复,并从实现中调用它。您可以使用Func<UserReportSavePermissionRequest,string,R>Action<T> types for it. Type R corresponds to the type of reportKey . I am assuming thatis of type字符串, and that ReportGroupNameKeys returns,而不是定义新的代理人。串[]`。

public void AddItem(
    UserReportSavePermissionRequest permissionRequest
,   Func<UserReportSavePermissionRequest,string,T> getReportKey
) {
    var key = AddGroupName(permissionRequest.GroupName);
    var reportKey = getReportKey(permissionRequest, key);
    AddPermission(permissionRequest, reportKey);
}

调用者现在需要传递两个附加参数。与您的AddItem对应的AddCustomer的调用将如下所示:

AddItem(permissionRequest, AddCustomerSpecific);

AddOnline的来电将是

AddItem(permissionRequest, AddOnlineSpecific);

答案 2 :(得分:1)

将委托声明为类级变量

public delegate void MyDelegate(UserReportSavePermissionRequest)

实例化代理

MyDelegate del = new MyDelegate(AddCustomer);
MyDelegate del2 = new MyDelegate(AddOnline);

或者,如果你甚至可以链接代表。

通过传递UserReportSavePermissionRequest实例

来调用委托上的方法
del(permissionRequest);

.Net提供内置代理。它们是Func,Action和Predicate Func委托表示一个接受参数并返回一些东西的方法 Action委托表示一个接受参数并且不返回任何内容的方法 谓词返回一个bool

请注意,方法的参数是可选的,并不总是必需的 在您的情况下,如果希望将方法作为参数传递给方法

,则可以使用Action委托

例如

public void MyMethod(Action<UserReportSavePermissionRequest> act, UserReportSavePermissionRequest obj)
{
    act.Invoke(obj);
}

上述方法可以称为

UserReportSavePermissionRequest obj;

MyMethod(AddCustomer, obj);
MyMethod(AddOnline, obj)