2011-07-12 3 views
6

ダイナミック変数を自分のアトリビュートのパラメータとして渡したいと思います。ここで私はEnvironment.MachineNameを使用する場合は、以下のコードを参照してください。アトリビュートにダイナミックな値を設定するには

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

をしかし、私はこのエラーを取得する: エラー1は、属性の引数は、属性パラメータの型の発現または配列の作成表現TYPEOF、定数式でなければなりませんAbc.ServiceBus.Monitoring.ViewModel

Environment.MachineNameを渡すためにできるだけクリーンな回避策がありますか?

ありがとうございました。

ジョン

PS:私はこのケースについて話いくつかの記事を見つけたが、それは2〜3年前のように書かれています。しかし、今日、.NET 4.0から来るclrは素晴らしい解決策をもたらしますか?

答えて

9

あなたは特別な値を持つ列挙型を作成し、属性に別のコンストラクタのオーバーロードでそれらを受け入れることができる:

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

属性パラメータはありません、実行時に、コンパイル時に評価されています。したがって、時定数をコンパイルする必要があります。

ただし、パラメータを1つしか取らず、実行時にEnvironment.MachineNameを使用する派生クラスLocalMachineConfigurationKey属性を作成すると、プロパティを評価できます。

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

コンパイル時の定数の回避策 – SimonGates

関連する問題