首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在我的属性中设置动态值

如何在我的属性中设置动态值
EN

Stack Overflow用户
提问于 2011-07-12 21:46:36
回答 2查看 21.2K关注 0票数 9

我想将一个动态变量作为参数传递给我的属性。这里我想使用Environment.MachineName,请看下面的代码:

代码语言:javascript
复制
public interface IMonitoringViewModelConfiguration : IConfigurationContainer
{
    [ConfigurationKey("MonitoringService", Environment.MachineName)]
    string ConnectionString { get; }
}

但我得到以下错误:错误1属性参数必须是属性参数类型Abc.ServiceBus.Monitoring.ViewModel的常量表达式、typeof表达式或数组创建表达式

有没有办法尽可能干净地通过我的Environment.MachineName?

谢谢。

约翰

PS:我找到了一些关于这个案例的文章,但它大概是在2-3年前写的。但是今天,来自.NET 4.0的clr提供了一些很好的解决方案吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-12 21:50:57

您可以创建一个具有特殊值的枚举,并在属性中的单独构造函数重载中接受它们:

代码语言:javascript
复制
enum SpecialConfigurationValues
{
    MachineName
    // , other special ones
}

class ConfigurationKeyAttribute : Attribute
{
    private string _key;
    private string _value;

    public ConfigurationKeyAttribute(string key, string value)
    {
        // ...
    }

    public ConfigurationKeyAttribute(string key, SpecialConfigurationValues specialValue)
    {
        _key = key;
        switch (specialValue)
        {
            case SpecialConfigurationValues.MachineName:
                _value = Environment.MachineName;
                break;
            // case <other special ones>
        }
    }
}

[ConfigurationKey("MonitoringService", SpecialConfigurationValues.MachineName)]
票数 12
EN

Stack Overflow用户

发布于 2011-07-12 21:52:00

属性参数在编译时计算,而不是在运行时计算。所以它们必须是编译时间常量...

但是,您可以创建一个派生类LocalMachineConfigurationKey属性,该属性只接受一个参数,并在运行时使用Environment.MachineName计算该属性。

代码语言:javascript
复制
public class ConfigurationKeyAttribute : Attribute
{
    private readonly string _key;
    private readonly string _machineName;

    public ConfigurationKeyAttribute(string key, string machineName)
    {
        _key = key;
        _machineName = machineName;
    }

    protected ConfigurationKeyAttribute(string key) : this(key, null)
    {
    }

    public string Key { get { return _key; } }
    public virtual string MachineName { get { return _machineName; } }
}

public class LocalMachineConfigurationKeyAttribute : ConfigurationKeyAttribute
{
    public LocalMachineConfigurationKeyAttribute(string key) : base(key)
    {
    }

    public override string MachineName { get { return Environment.MachineName; } }
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6665187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档