我正在尋找一種方法在我的代碼中實現DRY原則。我有這樣的代碼。多個屬性賦值
private static bool Inconsistent(AdStats adStat)
{
return
adStat.Daily.Impressions != adStat.Hourly.Sum(h => h.Value.Impressions) ||
adStat.Daily.Clicks != adStat.Hourly.Sum(h => h.Value.Clicks) ||
adStat.Daily.Spent != adStat.Hourly.Sum(h => h.Value.Spent) ||
adStat.Daily.SocialImpressions != adStat.Hourly.Sum(h => h.Value.SocialImpressions) ||
adStat.Daily.SocialClicks != adStat.Hourly.Sum(h => h.Value.SocialClicks) ||
adStat.Daily.SocialSpent != adStat.Hourly.Sum(h => h.Value.SocialSpent) ||
adStat.Daily.UniqueImpressions != adStat.Hourly.Sum(h => h.Value.UniqueImpressions) ||
adStat.Daily.UniqueClicks != adStat.Hourly.Sum(h => h.Value.UniqueClicks) ||
adStat.Daily.SocialUniqueImpressions != adStat.Hourly.Sum(h => h.Value.SocialUniqueImpressions) ||
adStat.Daily.SocialUniqueClicks != adStat.Hourly.Sum(h => h.Value.SocialUniqueClicks);
}
然後在社區的幫助下,我得到了一個很好的解決方案。
Func<AdStatsItem, int>[] metricGetters = {
s => s.Impressions,
s => s.Clicks,
s => s.Spent,
//...
};
return metricGetters.Any(getter => getter(adStat.Daily)
!= adStat.Hourly.Sum(h => getter(h.Value)));
但我想不出一種方法來使用相同的技術的代碼與多個任務。
hourly.Impressions += delta.Impressions;
hourly.Clicks += delta.Clicks;
hourly.Spent += delta.Spent;
hourly.SocialImpressions += delta.SocialImpressions;
hourly.SocialClicks += delta.SocialClicks;
hourly.SocialSpent += delta.SocialSpent;
hourly.UniqueImpressions += delta.UniqueImpressions;
hourly.SocialUniqueImpressions += delta.SocialUniqueImpressions;
hourly.UniqueClicks += delta.UniqueClicks;
hourly.SocialUniqueClicks += delta.SocialUniqueClicks;
經過一番思考,我想出了這個。
Expression<Func<AdStatsItem, int>>[] metricGetters = {
stat => stat.Impressions,
stat => stat.Clicks,
//...
};
var type = typeof (AdStatsItem);
foreach (var metric in metricGetters)
{
var body = (MemberExpression)metric.Body;
var propertyName = body.Member.Name;
var prop = type.GetProperty(propertyName);
var val = (int)prop.GetValue(hourly, null) + (int)prop.GetValue(delta, null);
prop.SetValue(hourly, val, null);
}
但反射的用法真的讓我感到困擾。有沒有更好的辦法擺脫上述冗餘?
在這種情況下,你不會獲得通過保理什麼。如果您對所使用的屬性有一些假設,如所有公共數字屬性,則可以對其進行增強。否則,你最終會得到一堆比你當前的實現更不可讀的代碼。 – Pragmateek