В C#, если у меня есть общие объекты c, как я могу в общем указать получение и установку полей для этих объектов? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть две очень похожие функции:

        public Dictionary<string, T> UpdateSuccessProperties<T, TU>(Dictionary<string, T> oldSObjectByAlternativeIds, List<TU> updatedSObjects)
        where TU : T
        where T : AlternativeIdentifiable {
            updatedSObjects.ForEach((updatedSObject) => {
                    if (oldSObjectByAlternativeIds.TryGetValue(updatedSObject.GetAlternativeId(), out T oldSObject)) {
                        oldSObject.SalesforceId = updatedSObject.SalesforceId;
                    }
                });

            return oldSObjectByAlternativeIds;
        }
        public Dictionary<string, T> UpdateFailureProperties<T, TU>(Dictionary<string, T> oldSObjectByAlternativeIds, List<TU> updatedSObjects)
        where TU : T
        where T : AlternativeIdentifiable {
            updatedSObjects.ForEach((updatedSObject) => {
                    if (oldSObjectByAlternativeIds.TryGetValue(updatedSObject.GetAlternativeId(), out T oldSObject)) {
                        oldSObject.SalesforceError = updatedSObject.SalesforceError;
                    }
                });

            return oldSObjectByAlternativeIds;
        }

Следует заметить, что есть только 3 отличия, кроме имени метода:

  • Самый конец URL-адрес
  • Свойство oldSObject типа T, которое получит новое значение.
  • Свойство updatedSObject типа TU, которое предоставит старое значение.

Есть ли способ объединить их во что-то вроде этого (псевдокод, не работает):

        public Dictionary<string, T> UpdateProperties<T, TU>(Dictionary<string, T> oldSObjectByAlternativeIds, List<TU> updatedSObjects, string receiverField, string supplierField)
        where TU : T
        where T : AlternativeIdentifiable {
            updatedSObjects.ForEach((updatedSObject) => {
                    if (oldSObjectByAlternativeIds.TryGetValue(updatedSObject.GetAlternativeId(), out T oldSObject)) {
                        oldSObject.set(receiverField, updatedSObject.get(supplierField));
                    }
                });

            return oldSObjectByAlternativeIds;
        }

?

Последние два параметра не обязательно быть струнами; Я бы предпочел что-нибудь безопасное.

1 Ответ

2 голосов
/ 13 июля 2020

Почему бы не использовать Action<T, TU>, который может быть: (oldSObject, updatedSObject) => oldSObject.SalesforceError = updatedSObject.SalesforceError:

public Dictionary<string, T> UpdateFailureProperties<T, TU>(Dictionary<string, T> oldSObjectByAlternativeIds, List<TU> updatedSObjects, Action<T, TU> callback)
    where TU : T
    where T : AlternativeIdentifiable
{
    updatedSObjects.Get(url, context.token)
        .FromCsv<List<TU>>()
        .ForEach((updatedSObject) =>
        {
            if (oldSObjectByAlternativeIds.TryGetValue(updatedSObject.GetAlternativeId(), out T oldSObject))
            {
                callback(oldSObject, updatedSObject);
            }
        });

    return oldSObjectByAlternativeIds;
}
...