значение настройки из диспетчера конфигурации в атрибуте - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть пользовательский атрибут, как показано ниже

public class PageUrlAttribute : Attribute
{


    public PageUrlAttribute(string host)
    {
        Host = host;
        Path = string.Empty;
        Protocol = "http";
    }

    public string Protocol { get; set; }

    public string Path { get; set; }

    public string Host { get; private set; }
 }

Я использую его в другом классе, как показано ниже

[PageUrl("test.com", Protocol = "https")]
public class LoginPage : AbstractPage
{
}

Теперь я хочу установить это значение " test.com"из файла app.config.

Я попытался установить, как показано ниже

[PageUrl(ConfigurationManager.AppSettings["URL"], Protocol = "https")]

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

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

В комментариях вы указали переменные, которые вам нужны, есть постоянные времени выполнения. Это означает, что они не изменятся во время выполнения, поэтому вы можете объявить их в открытом статическом классе с полями const:

public static class DebugVariables
    {
        public const string TEST_URL = "test.com";

        public const string HTTPS_PROTOCOL = "https";
    }

Теперь вы можете использовать этот класс в своем Атрибуте следующим образом:

[PageUrl(DebugVariables.TEST_URL, Protocol = DebugVariables.HTTPS_PROTOCOL)]

А теперь совместим эти знания с вашим делом: Прежде всего, проверьте настройки вашего проекта (щелкните правой кнопкой мыши ваш проект и вкладку Build), если вы установили флажок Определить константу отладки. если вы установили этот (или любой другой символ, который вы хотели) в сборке Debug и удалили его в своей сборке выпуска, теперь вы можете использовать его вместе с директивой препроцессора #if, #else и #endif для определения следующего:

#if DEBUG
    [PageUrl(DebugVariables.TEST_URL, Protocol = DebugVariables.HTTPS_PROTOCOL)]
#else
    [PageUrl(ProductionVariables.TEST_URL, Protocol = ProductionVariables.HTTPS_PROTOCOL)]
#endif
    public class LoginPage : AbstractPage
    {
    }

Если вы правильно установили постоянную отладки, вы должны увидеть, что один из путей неактивен, а другой нет. Если вы сейчас переключитесь на свой Release Build, вы должны увидеть изменение, которое означает, что отладка затенена, а другой правильно выделен.

Это означает, что вы можете создать столько статических классов с полями const, сколько вам нужно, а затем использовать приведенный выше синтаксис для установки значения в зависимости от вашей среды.

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

Аргументы атрибута должны быть константами времени компиляции, но параметры конфигурации не являются временем компиляции.

это может быть возможно при чтении значений конфигурации в конструкторе

Host = ConfigurationManager.AppSettings ["URL"];

Если у вас несколько URL, отправьте ключ в качестве параметра конструктору.

Host = ConfigurationManager.AppSettings [параметр];

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