首页 > 解决方案 > 在 C# 中,如何合并甚至删除两个几乎是 poltergeists 的 C# 类?

问题描述

我有两节课:

    public class UploadedBankData : BankData {

        [DataMember(Name = "sf__Id")]
        public new string SalesforceId {
            get => base.SalesforceId;
            set => base.SalesforceId = value;
        }

        [DataMember(Name = "sf__Created")]
        public bool SalesforceCreated { get; set; }

    }

    public class UploadedPersonAccount : PersonAccount {

        [DataMember(Name = "sf__Id")]
        public new string SalesforceId {
            get => base.SalesforceId;
            set => base.SalesforceId = value;
        }

        [DataMember(Name = "sf__Created")]
        public bool SalesforceCreated { get; set; }

    }

如您所见,除了类的名称和它们扩展的类之外,这两个类是相同的。

这些类之所以存在,是因为我正在使用ServiceStack.Text将基类转换为 CSV,通过 Bulk API 2.0 将 CSV 上传到 Salesforce (必须对其 SaleforceId 进行注释,[IgnoreDataMember]否则上传将失败,然后使用新生成的 SalesforceIds 将使用以下代码分配回相应的记录:

        public Dictionary<string, T> Update<T, TU>(Dictionary<string, T> oldSObjectBySalesforceAccountId, RelayerContext context)
        where TU : T
        where T : AlternativeIdentifiable {
            IConfiguration config = context.Config;
            string url = $"{config["SalesforceInstanceBaseUrl"]}/services/data/{config["SalesforceVersion"]}/jobs/ingest/{context.job.Id}/successfulResults";

            this.restClient.Get(url, context.token)
            .FromCsv<List<AlternativeIdentifiable>>()
            .ForEach((updatedBankData) => {
                if (oldSObjectBySalesforceAccountId.TryGetValue(updatedBankData.GetAlternativeId(), out T oldSObject)) {
                    oldSObject.SalesforceId = updatedBankData.SalesforceId;
                }
            });

            return oldSObjectBySalesforceAccountId;
        }

由于该解决方案最终可能会支持其他 SObject,因此创建维护将需要许多几乎相同的类。

有没有更好的办法?

标签: c#salesforcerefactoringbulkinsertcode-duplication

解决方案


推荐阅读