C# 重构调用具有不同参数签名的委托的方法

C# 重构调用具有不同参数签名的委托的方法,c#,refactoring,delegates,C#,Refactoring,Delegates,是否有一种模式可以应用于重构此代码?这两个方法之间唯一的区别是一个方法接受一个额外的参数并将其传递给委托 我发现委托不能接受重载的方法签名。如何再添加一级间接寻址?:) 不,你发布的代码实际上是应用这种模式的一种非常简洁的方法。除非有某种方法抽象被调用的方法的类型,或者删除所有类型安全性(我不建议这样做),否则您不会找到更简洁的方法。不,您发布的代码实际上是应用这种模式的一种非常简洁的方法。除非有某种方法抽象被调用的方法的类型,或者通过删除所有类型安全性(我不建议这样做),否则您不会找到更简洁的

是否有一种模式可以应用于重构此代码?这两个方法之间唯一的区别是一个方法接受一个额外的参数并将其传递给委托

我发现委托不能接受重载的方法签名。如何再添加一级间接寻址?:)


不,你发布的代码实际上是应用这种模式的一种非常简洁的方法。除非有某种方法抽象被调用的方法的类型,或者删除所有类型安全性(我不建议这样做),否则您不会找到更简洁的方法。不,您发布的代码实际上是应用这种模式的一种非常简洁的方法。除非有某种方法抽象被调用的方法的类型,或者通过删除所有类型安全性(我不建议这样做),否则您不会找到更简洁的方法。您可以使用匿名方法或lambda,如下所示:

delegate void ProcessDelegate<T>(T param);
.
.
public static void Process<T>(ProcessDelegate<T> processDelegate)
{
    using (var esb = ExchangeService.GetExchangeServiceBinding())
    {
        var contactFolder = FolderService.GetPublicFolder(esb,  
            Properties.Settings.Default.ExchangePublicFolderName);
        processDelegate(contactFolder);
    }
}

其中MyMethod是您正在调用的实际方法,因此您将其包含在lambda表达式中,而不是委托中。想一想这样可能行吗?

您可以使用匿名方法或类似的lambda:

delegate void ProcessDelegate<T>(T param);
.
.
public static void Process<T>(ProcessDelegate<T> processDelegate)
{
    using (var esb = ExchangeService.GetExchangeServiceBinding())
    {
        var contactFolder = FolderService.GetPublicFolder(esb,  
            Properties.Settings.Default.ExchangePublicFolderName);
        processDelegate(contactFolder);
    }
}
    public delegate void Action(TYPE_OF_ESB esb, TYPE_OF_CONTACT_FOLDER contact folder);
    private static void Process(Action action)
    {
        using (var esb = ExchangeService.GetExchangeServiceBinding())
        {
            var contactFolder = FolderService.GetPublicFolder(esb, Properties.Settings.Default.ExchangePublicFolderName);
            action(esb, contactfolder);
        }
    }

Process((esb, contactfolder)=>processFolderDelegate(esb, contactFolder));
Process((esb, contactfolder)=>processContactDelegate(esb, contactFolder, contact));
其中MyMethod是您正在调用的实际方法,因此您将其包含在lambda表达式中,而不是委托中。想一想这样可能行吗?

公共静态void ProcessFolder(ProcessFolderDelegate)
    public delegate void Action(TYPE_OF_ESB esb, TYPE_OF_CONTACT_FOLDER contact folder);
    private static void Process(Action action)
    {
        using (var esb = ExchangeService.GetExchangeServiceBinding())
        {
            var contactFolder = FolderService.GetPublicFolder(esb, Properties.Settings.Default.ExchangePublicFolderName);
            action(esb, contactfolder);
        }
    }

Process((esb, contactfolder)=>processFolderDelegate(esb, contactFolder));
Process((esb, contactfolder)=>processContactDelegate(esb, contactFolder, contact));
{ 过程((b,f)=>del(b,f)); } 公共静态无效ProcessContact(ProcessContactDel,联系人联系人) { 过程((b,f)=>del(b,f,触点)); } 私有静态无效过程( 行动(行动) { //我猜esb属于ExchangeServiceBinding类型 //并且该contactFolder的类型为ContactsFolderType //如果不是这样,则更改类型参数 //上面的方法签名中的操作委托的 使用(var esb=ExchangeService.GetExchangeServiceBinding()) { var contactFolder=FolderService.GetPublicFolder( esb、Properties.Settings.Default.ExchangePublicFolderName); 操作(esb、contactFolder); } }
公共静态无效ProcessFolder(ProcessFolderDelegate)
{
过程((b,f)=>del(b,f));
}
公共静态无效ProcessContact(ProcessContactDel,联系人联系人)
{
过程((b,f)=>del(b,f,触点));
}
私有静态无效过程(
行动(行动)
{
//我猜esb属于ExchangeServiceBinding类型
//并且该contactFolder的类型为ContactsFolderType
//如果不是这样,则更改类型参数
//上面的方法签名中的操作委托的
使用(var esb=ExchangeService.GetExchangeServiceBinding())
{
var contactFolder=FolderService.GetPublicFolder(
esb、Properties.Settings.Default.ExchangePublicFolderName);
操作(esb、contactFolder);
}
}

我同意。这两个方法中的复制看起来像是一种代码味道,但我不担心这么小的方法会产生这种味道。我同意。这两个方法中的复制看起来像是一种代码味道,但我不担心这么小的方法。参数'ProcessDelegate'有一个错误:使用泛型类型'ProcessDelegate'需要'1'类型ArgumentsOrry,修复了我的答案,忘记在方法中放置泛型类型参数参数“ProcessDelegate”有一个错误:使用泛型类型“ProcessDelegate”需要“1”类型参数,修复了我的答案,忘记在方法中放置泛型类型参数
public static void ProcessFolder(ProcessFolderDelegate del)
{
    Process((b, f) => del(b, f));
}

public static void ProcessContact(ProcessContactDelegate del, Contact contact)
{
    Process((b, f) => del(b, f, contact));
}

private static void Process(
    Action<ExchangeServiceBinding, ContactsFolderType> action)
{
    // i've guessed that esb is of type ExchangeServiceBinding
    // and that contactFolder is of type ContactsFolderType
    // if that's not the case then change the type parameters
    // of the Action delegate in the method signature above

    using (var esb = ExchangeService.GetExchangeServiceBinding())
    {
        var contactFolder = FolderService.GetPublicFolder(
            esb, Properties.Settings.Default.ExchangePublicFolderName);
        action(esb, contactFolder);
    }
}