我有下面这段代码,我总是将SONAR强调为主要问题,因为违反了使用以下消息调用的规则。
多次(3)调用虚拟属性'System.String System.Reflection.MemberInfo :: get_Name()'。
规则说明
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 行?我怎么能避免呢?
答案 0 :(得分:0)
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规则的支持。