Cómo establecer el valor dynamic en mi Atributo

Me gustaría pasar una variable dinámica como parámetro a mi atributo. Aquí quiero usar Environment.MachineName, vea el siguiente código:

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

Pero obtengo este error: Error 1 Un argumento de atributo debe ser una expresión constante, un tipo de expresión o una expresión de creación de matriz de un tipo de parámetro de atributo Abc.ServiceBus.Monitoring.ViewModel

¿Hay alguna solución tan limpia como sea posible para pasar mi Environment.MachineName?

Gracias.

John

PD: He encontrado algunos artículos que hablan sobre este caso, pero se han escrito como hace 2-3 años. Pero hoy, ¿el clr que viene de .NET 4.0 ofrece alguna buena solución?

Puede crear una enumeración con valores especiales y aceptarlos en una sobrecarga de constructor separada en el atributo:

 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  } } } [ConfigurationKey("MonitoringService", SpecialConfigurationValues.MachineName)] 

Los parámetros de atributo se evalúan en tiempo de comstackción, no en tiempo de ejecución. Entonces tienen que ser constantes de tiempo de comstackción …

Sin embargo, podría crear un atributo LocalMachineConfigurationKey clase derivada que tome solo un parámetro y utilice Environment.MachineName en tiempo de ejecución para evaluar la propiedad.

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