如何在我的属性中设置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; } } }