我在下面有这段代码,由于违反了使用以下消息调用的规则,因此我总是被 SONAR 突出显示为主要问题。
多次 (3) 调用虚拟属性“System.String System.Reflection.MemberInfo::get_Name()”。
规则描述说
AvoidRepetitiveCallsToPropertiesRule
gendarme : AvoidRepetitiveCallsToPropertiesRule 如果虚拟的或不太可能内联的属性 getter 被方法调用多次,则规则会发出警告。在大多数情况下,重复调用只是需要更多时间而没有任何收益,因为结果总是相同的。如果每次调用属性时都需要不同的值(例如调用 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 ?我怎样才能避免它?