1

以下のメッセージで呼び出されたルールに違反しているため、SONAR によって常に重大な問題として強調されている以下のコードがあります。

仮想プロパティ 'System.String System.Reflection.MemberInfo::get_Name()' への複数 (3) の呼び出し。

そして、ルールの説明は言う

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について不平を言っている場合は? どうすれば回避できますか?

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);
        }
    }
}
...

Gendarme ルールのサポートは、C# プラグインの 3.0 バージョンでは削除されたことに注意してください。

于 2015-07-08T08:30:51.263 に答える