我具有如下自定义属性
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需要常数。如何解决此问题或其他任何想法?
答案 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 [参数];