SONAR错误AvoidRepetitiveCallsToPropertiesRule是什么意思?

时间:2015-07-07 17:12:21

标签: c# .net reflection sonarqube sonarlint

我有下面这段代码,我总是将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 行?我怎么能避免呢?

1 个答案:

答案 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规则的支持。