首页 > 解决方案 > 在 C# 中,当列表和枚举类型中的对象没有公共继承或接口时,是否可以删除代码重复?

问题描述

我们从 Praxedo 导入了多个 WSDL 文件。在使用这些 WSDL 文件时,有时我想摆脱代码重复。

具体来说,我有多个代码实例,如下所示:

private static customer ToSomething(OurConfig config)
        {
            // Snip! ... do some irreverent things.

            List<contact> contacts = new();
            AddIfValid(contacts, config.Phone, type.PHONE);
            AddIfValid(contacts, config.PrimaryContact?.Phone, type.MOBILE);
            AddIfValid(contacts, config.PrimaryContact?.Email, type.EMAIL);
            // Maybe some more things like this...

            // Snip! ... do moreirreverent things.

            return something;
        }

        private static List<contact> AddIfValid(List<contact> contacts, string value, type contactType)
        {
            if (!string.IsNullOrEmpty(value))
            {
                contacts.Add(new()
                {
                    coordinates = value,
                    type = contactType,
                    typeSpecified = true
                });
            }
            return contacts;
        }

棘手的地方:

对象contactenum类型在从 WSDL 生成的每个 Reference.cs 中分别实现,我们不想修改这些类来为它们添加任何公共父级或接口(无论如何,这甚至可能与枚举无关) .

有没有办法:

  1. 我可以声明AddIfValid()采用类型参数的方法吗?

  2. 假设每个实例上都存在所有枚举值,有什么方法可以提取块

            List<contact> contacts = new();
            AddIfValid(contacts, config.Phone, type.PHONE);
            AddIfValid(contacts, config.PrimaryContact?.Phone, type.MOBILE);
            AddIfValid(contacts, config.PrimaryContact?.Email, type.EMAIL);

那我可以重复使用吗?

(类型OurConfig是我们的。目前它总是完全相同的类型,如果需要或需要,我们可以修改它。)

标签: listenumsrefactoringgeneric-type-parameterspraxedo

解决方案


推荐阅读