2011-07-12 13 views
6

में गतिशील मान कैसे सेट करें मैं अपनी विशेषता के पैरामीटर के रूप में गतिशील चर को पास करना चाहता हूं। यहाँ मैं Environment.MachineName उपयोग करने के लिए नीचे दिए गए कोड को देखने के लिए चाहते हैं:मेरी विशेषता

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

लेकिन मैं इस त्रुटि मिलती है: त्रुटि 1 एक विशेषता तर्क एक निरंतर अभिव्यक्ति होना चाहिए, typeof एक विशेषता पैरामीटर प्रकार की अभिव्यक्ति या सरणी निर्माण अभिव्यक्ति Abc.ServiceBus.Monitoring.ViewModel

क्या मेरे पर्यावरण को पारित करने के लिए जितना संभव हो उतना स्वच्छ काम है। माचिननाम?

धन्यवाद।

जॉन

पुनश्च: मैं कुछ लेख जो इस मामले के बारे में बात मिल गया है, लेकिन यह 2-3 साल पहले की तरह लिखा गया है। लेकिन आज, क्या एनआरईटी 4.0 से आता है जो कुछ अच्छा समाधान देता है?

उत्तर

9

आप विशेष मूल्यों के साथ एक enum बना सकते हैं, और उन्हें विशेषता में एक अलग निर्माता अधिभार में स्वीकार करते हैं:

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

गुण पैरामीटर, संकलन समय पर मूल्यांकन किया जाता है रनटाइम पर नहीं। तो उन्हें संकलन समय स्थिरांक होना चाहिए ...

हालांकि, आप एक व्युत्पन्न कक्षा 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; } } 
} 
+0

1+ संकलन समय स्थिरांक वर्कअराउंड के लिए – SimonGates

संबंधित मुद्दे