如何在我的属性中设置dynamic值

我想将一个dynamicvariables作为parameter passing给我的属性。 这里我想使用Environment.MachineName,看下面的代码:

public interface IMonitoringViewModelConfiguration : IConfigurationContainer { [ConfigurationKey("MonitoringService", Environment.MachineName)] string ConnectionString { get; } } 

但是我得到这个错误:错误1一个属性参数必须是一个常量expression式,typeofexpression式或数组创buildexpression式属性参数typesAbc.ServiceBus.Monitoring.ViewModel

有没有任何解决方法尽可能干净,以通过我的Environment.MachineName?

谢谢。

约翰

PS:我发现了一些关于这个案例的文章,但是它已经被写入了2 – 3年前。 但是今天,来自.NET 4.0的clr是否提供了一些很好的解决scheme?

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

 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)] 

属性参数是在编译时评估的,而不是在运行时。 所以他们必须是编译时间常量…

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

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