Ошибка анализа кода CA1000: DoNotDeclareStaticMembersOnGenericTypes C # - PullRequest
0 голосов
/ 03 января 2019

Вот мой фрагмент кода, где я вызываю свойство универсального класса PageObjectBase для возврата экземпляра. Это работает нормально, но когда я запускаю анализ кода, получаю следующие ошибки:

CA1000 Удалите «PageObjectBase .PageObject» из «PageObjectBase » или сделайте его элементом экземпляра

CA1000 Удалите «PageObjectBase .InstanceCreation ()» из «PageObjectBase » или сделайте его элементом экземпляра

Как можно устранить эту ошибку, не затрагивая TestBase и логику, реализованную в PageObjectBase?

public class TestBase
{           
    public T NavigateToScreenandReturnPageObject<T>() where T :class, new()
    {
        return PageObjectBase<T>.PageObject;
    }
}

public static class PageObjectBase<T> where T : class, new()
{
    private static T singleTonObject;

    public static T PageObject
    {
        get
        {
            return InstanceCreation();
        }
    }

    public static T InstanceCreation()
    {           
        if (singleTonObject == null)
        {
           singleTonObject = new T();
        }
        return singleTonObject;
    }
}

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Здесь нечего исправить, основываясь на этих предупреждениях. Эти предупреждения предназначены для людей, которые неправильно используют статические переменные в универсальных классах, но не понимают, что каждый универсальный тип создает разные статические переменные. Ваш код фактически использует преимущества работы статических переменных в общих классах.

Я также определенно рекомендую вам прочитать ссылку, рекомендованную Алексеем для исправления вашей реализации синглтона. http://csharpindepth.com/Articles/General/Singleton.aspx

0 голосов
/ 03 января 2019

Причина этого заключается в том, что статический член в универсальном типе не будет совместно использоваться экземплярами различных закрытых типов. Это означает, что для универсального класса MyGeneric, который имеет открытую статическую строку MyProp {get; задавать; } значения MyGeneric.MyProp и MyGeneric.MyProp имеют совершенно разные независимые значения.

В большинстве случаев это может привести к ошибкам во время выполнения, и поэтому анализ кода предлагает рекомендации, позволяющие этого избежать.

Если вы все еще хотите сохранить статические члены в типе и сохранить правило анализа кода, то. Я бы предложил создать неуниверсальный базовый класс для типов T и использовать там статический метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...