在属性中从配置管理器设置值

时间:2019-04-03 14:55:38

标签: c# attributes

我具有如下自定义属性

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
{
}

现在,我想从app.config文件中将此值设置为“ test.com ”。

我试图设置如下

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

但这会引发错误,表明Attribute需要常数。如何解决此问题或其他任何想法?

2 个答案:

答案 0 :(得分:1)

在注释中,您指出了所需的变量是运行时常量。这意味着它们在执行期间不会更改,因此您可以在带有const字段的公共静态类中声明它们:

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

        public const string HTTPS_PROTOCOL = "https";
    }

您现在可以像这样在您的Attribute中使用此类:

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

现在将这些知识结合到您的案例中: 首先,如果已将复选框设置为Define DEBUG Constant,则检查项目设置(右键单击项目和Tab Build)。如果您已在Debug版本中设置了这个(或您想要的任何其他Symbol)并在Release版本中将其删除,则现在可以将其与Preprocessor Directive#if,#else和#endif一起使用以定义以下内容: / p>

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

如果正确设置了DEBUG常量,则应该看到其中一个路径显示为灰色,而另一个不显示为灰色。如果现在切换到发布版本,您应该会看到“更改”显示为灰色,而另一个已正确突出显示。

这意味着您可以根据需要使用const字段创建尽可能多的静态类,然后使用上述语法根据您的环境设置Value。

答案 1 :(得分:0)

属性参数必须是编译时常量,但配置设置不是编译时。

这是可能的,其中在构造函数中读取配置值

主机= ConfigurationManager.AppSettings [“ URL”];

如果您有多个URL,请将密钥作为参数发送给构造函数。

主机= ConfigurationManager.AppSettings [参数];