1

我在下面有这段代码,由于违反了使用以下消息调用的规则,因此我总是被 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 ?我怎样才能避免它?

4

1 回答 1

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 版本中被删除。

于 2015-07-08T08:30:51.263 回答