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

C# 如何将这两个方法转换为委托调用?,c#,delegates,C#,Delegates,我知道用德拉格特可以做到以下几点。我不知道怎么做。 我几乎没有使用代理的经验。我重构了每个方法的具体内容,并 将共享信息留在其中 public void AddCustomer(UserReportSavePermissionRequest permissionRequest) { var key = AddGroupName(permissionRequest.GroupName); var reportKey = AddCustomerSpecific(permissionR

我知道用德拉格特可以做到以下几点。我不知道怎么做。 我几乎没有使用代理的经验。我重构了每个方法的具体内容,并 将共享信息留在其中

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);
}
我不知道如何做到这一点。此外,我正在寻找一个很好的教程,代表,以帮助我得到
更好地理解它们。

对于为什么希望这些方法成为委托,您没有给出太多解释,因此我假设您希望能够从其他类调用这些方法

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

您的代理签名没有返回值,只有一个类型为
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

对于为什么希望这些方法成为委托,您没有给出太多解释,所以我假设您希望能够从其他类调用这些方法

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

您的代理签名没有返回值,只有一个类型为
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

将委托声明为类级变量

public delegate void MyDelegate(UserReportSavePermissionRequest)
实例化委托

MyDelegate del = new MyDelegate(AddCustomer);
MyDelegate del2 = new MyDelegate(AddOnline);
或者,如果您甚至可以链接代理

通过传递UserReportSavePermissionRequest实例来调用委托上的方法

del(permissionRequest);
.Net提供内置委托。它们是Func、Action和Predicate Func委托表示接受参数并返回某些内容的方法 动作委托表示接受参数但不返回任何内容的方法 谓词返回布尔值

请注意,这些方法的参数是可选的,并不总是必需的 在您的情况下,如果希望将方法作为参数传递给方法,则可以使用Action委托

e、 g


将委托声明为类级变量

public delegate void MyDelegate(UserReportSavePermissionRequest)
实例化委托

MyDelegate del = new MyDelegate(AddCustomer);
MyDelegate del2 = new MyDelegate(AddOnline);
或者,如果您甚至可以链接代理

通过传递UserReportSavePermissionRequest实例来调用委托上的方法

del(permissionRequest);
.Net提供内置委托。它们是Func、Action和Predicate Func委托表示接受参数并返回某些内容的方法 动作委托表示接受参数但不返回任何内容的方法 谓词返回布尔值

请注意,这些方法的参数是可选的,并不总是必需的 在您的情况下,如果希望将方法作为参数传递给方法,则可以使用Action委托

e、 g


假设
AssociateCustomerReportsToGroupNameBy
AssociateOnlineReportsToGroupNameBy
具有相同的签名,您可以通过传入一个与这两个方法具有相同签名的委托,并从实现中调用它来消除公共代码的重复。您可以使用
Func
操作类型,而不是定义新委托。类型
R
对应于
reportKey
的类型。我假设
key
是类型
string
,并且
ReportGroupNameKeys
返回
string[]`

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

AddItem(permissionRequest, AddOnlineSpecific);

假设
AssociateCustomerReportsToGroupNameBy
AssociateOnlineReportsToGroupNameBy
具有相同的签名,您可以通过传入一个与这两个方法具有相同签名的委托,并从实现中调用它来消除公共代码的重复。您可以使用
Func
操作类型,而不是定义新委托。类型
R
对应于
reportKey
的类型。我假设
key
是类型
string
,并且
ReportGroupNameKeys
返回
string[]`

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

AddItem(permissionRequest, AddOnlineSpecific);