Come impostare il valore dinamico nel mio Attributo

Vorrei passare una variabile dynamic come parametro al mio attributo. Qui voglio usare Environment.MachineName, vedi il codice qui sotto:

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

Ma ottengo questo errore: Errore 1 Un argomento di attributo deve essere un’espressione costante, typeof espressione o espressione di creazione di matrice di un parametro di attributo tipo Abc.ServiceBus.Monitoring.ViewModel

C’è qualche soluzione alternativa il più pulita ansible per passare il mio Environment.MachineName?

Grazie.

John

PS: Ho trovato alcuni articoli che parlano di questo caso ma sono stati scritti come 2-3 anni fa. Ma oggi, il clr che proviene da .NET 4.0 offre qualche bella soluzione?

È ansible creare un enum con valori speciali e accettarli in un sovraccarico del costruttore separato nell’attributo:

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

I parametri degli attributi vengono valutati in fase di compilazione, non in fase di runtime. Quindi devono essere costanti di tempo di compilazione …

Tuttavia, è ansible creare un attributo LocalMachineConfigurationKey class derivata che accetta un solo parametro e utilizza Environment.MachineName in fase di runtime per valutare la proprietà.

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