以下のメッセージで呼び出されたルールに違反しているため、SONAR によって常に重大な問題として強調されている以下のコードがあります。
仮想プロパティ 'System.String System.Reflection.MemberInfo::get_Name()' への複数 (3) の呼び出し。
そして、ルールの説明は言う
AvoidRepetitiveCallsToPropertiesRule
gendarme : AvoidRepetitiveCallsToPropertiesRule このルールは、仮想の、またはインライン化できない可能性のあるプロパティ ゲッターがメソッドによって複数回呼び出された場合に警告します。ほとんどの場合、結果が常に同じであるため、繰り返し呼び出しを行うと、何の利益も得られずに時間がかかります。プロパティが呼び出されるたびに異なる値が予想される場合 (DateTime.Now の呼び出しなど)、報告された欠陥を無視する必要があります。**
private static void OverrideConfigurationValues(ConfigA configa,
ConfigB configb, ConfigC configc)
{
Type t = configa();
var properties = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
var overriddenvalues = new Dictionary<string, object>();
foreach (var prop in properties)
{
var value = prop.GetValue(configa,null);
if (value != null)
{
overriddenvalues.Add(prop.Name, value);
}
}
Type b = configb.GetType();
foreach (var prop in b.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
if (!overriddenvalues.ContainsKey(prop.Name))
{
var value = prop.GetValue(b,null);
if (value != null)
{
overriddenvalues.Add(prop.Name, value);
}
}
}
foreach (var overriddenvalue in overriddenvalues)
{
var overriden = overriddenvalue;
foreach (var prop in configa.GetType().GetProperties().Where(prop => prop.Name == overriden.Key))
{
prop.SetValue(configa, overriddenvalue.Value,null);
}
}
}
SONAR がforeach ループ内にある行prop.Nameについて不平を言っている場合は? どうすれば回避できますか?