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);