SONAR Error AvoidRepetitiveCallsToPropertiesRule是什么意思?

本文关键字:意思 是什么 AvoidRepetitiveCallsToPropertiesRule Error SONAR | 更新日期: 2023-09-27 18:01:22

我有下面这段代码,我总是把它作为一个主要问题突出显示,因为它违反了下面消息所调用的规则。

多次(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循环?我怎样才能避免呢?

SONAR Error AvoidRepetitiveCallsToPropertiesRule是什么意思?

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