我有下面这段代码,我总是把它作为一个主要问题突出显示,因为它违反了下面消息所调用的规则。
多次(3)调用虚拟财产'System '。字符串System.Reflection.MemberInfo: get_Name()"。
规则描述是
AvoidRepetitiveCallsToPropertiesRule
避免repetitivecallstopropertiesrule该规则警告,如果属性getter是虚拟的,或者不太可能是内联的,则一个方法会多次调用属性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);
}
}
}
如果声纳抱怨线prop。名称,我有在foreach循环?我怎样才能避免呢?
Ron Beyer的评论是对这个问题的恰当回答。
因此,根据他的注释,你的代码看起来像这样:...
foreach (var prop in b.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
var propName = prop.Name;
if (!overriddenvalues.ContainsKey(propName))
{
var value = prop.GetValue(b,null);
if (value != null)
{
overriddenvalues.Add(propName, value);
}
}
}
...
注意,在c#插件的3.0版本中放弃了对Gendarme规则的支持。