2009-12-15 55 views
0

我正嘗試使用兩個(或更多)離散設置組創建一個程序,它們都符合相同的接口。特別是我想要做的東西像下面,使用設計器生成的設置:具有相同接口的C#多個設置文件

IMySettings settings = Properties.A; 
Console.WriteLine(settings.Greeting); 
settings = Properties.B; 
Console.WriteLine(settings.Greeting); 

這將是微不足道一起去的接口,因爲任何類,提供的方法可以分配,但我怎麼能實現(?)這在C#中有其嚴格的接口實現規則?

注:C#/。NET 2.0

回答

2

的Properties.Settings類在VS中生成不會讓你這樣做。考慮定義一個簡單的DTO類並用XmlAttribute標記它,以便您可以輕鬆地反序列化它。

+0

爲什麼?它只需將接口添加到生成的設置類定義中。缺點是每次更改設置時都會覆蓋它。無論如何,它仍然是完美的配色方案。 – Harry 2014-11-23 08:11:37

1

您可以在C#中使用接口了。

但是,如果您仍想使用設計器生成的設置,則必須編寫外觀類。

1

我不確定你問的是如何在C#中實現一個接口。

如果是,只要是這樣的:

Public Interface IMySettings { 
    Public string Greeting {get;set;} 
} 

然後,只需有你的「A」和「B」實現此接口,並返回所需的問候語。因此,您的屬性類將實現IMySettings,而不是直類:

Public class Properties { 
    public IMySettings A {get;set;} 
    public IMySettings B {get;set;} 
} 

因此,而不是使用「MySettings」,你的代碼看起來像這樣:

IMySettings settings = Properties.A; 
+0

如果我沒有理解錯,這是不行的因爲設置類是自動生成的,並沒有實現這種接口。 – 2009-12-15 19:09:17

1

我不確定您是否可以通過設計器生成的設置進行操作,但我不經常使用它們,因此我可能會出錯。但是,還有另外一種方法可以做到這一點:創建自己的ConfigurationSection

下面是一個例子:

public class MyProperties : ConfigurationSection { 
    [ConfigurationProperty("A")] 
    public MySettings A 
    { 
     get { return (MySettings)this["A"]; } 
     set { this["A"] = value; } 
    } 

    [ConfigurationProperty("B")] 
    public MySettings B 
    { 
     get { return (MySettings)this["B"]; } 
     set { this["B"] = value; } 
    } 
} 

public class MySettings : ConfigurationElement { 
    [ConfigurationProperty("greeting")] 
    public string Greeting 
    { 
     get { return (string)this["greeting"]; } 
     set { this["greeting"] = value; } 
    } 
} 

然後你的app.config/web.config中需要執行以下操作:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <section name="mySettings" type="Namespace.MyProperties, Assembly"/> 
    </configSections> 
    <mySettings> 
     <A greeting="Hello from A!" /> 
     <B greeting="Hello from B" /> 
    </mySettings> 
</configuration> 

有可能是在錯別字,但總體思路是存在的。希望有所幫助。

0

您可以使用自定義代碼生成器將您的接口插入生成的代碼中(使用此處的方法:http://brannockdevice.blogspot.co.uk/2006_01_22_archive.html)。這非常簡單而且非常整潔,但問題是,如果你在一個團隊中工作,那麼他們都需要更新註冊表來構建解決方案。

另一種選擇,也可能是最接近的答案,你原來的問題,是通過顯式的創建一個通用屬性的類,然後填充,可能 -

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Configuration; 

namespace ConsoleApplication6 
{ 

    // use this class if you plan to add lots more settings files in future (low maintenance) 
    class GenericProps1 
    { 
     public string TestString { get; private set; } 

     // single cast for all settings files 
     public static explicit operator GenericProps1(ApplicationSettingsBase props) 
     { 
      return new GenericProps1() { TestString = props.Properties["TestString"].DefaultValue.ToString() }; 
     } 
    } 

    // use this class if you do NOT plan to add lots more settings files in future (nicer code) 
    class GenericProps2 
    { 
     public string TestString { get; private set; } 

     // cast needed for settings1 file 
     public static explicit operator GenericProps2(Properties.Settings1 props) 
     { 
      return new GenericProps2() { TestString = props.TestString }; 
     } 

     // cast needed for settings 2 file 
     public static explicit operator GenericProps2(Properties.Settings2 props) 
     { 
      return new GenericProps2() { TestString = props.TestString }; 
     } 

     // cast for settings 3,4,5 files go here... 
    } 


    class Program 
    { 
     // usage 
     static void Main(string[] args) 
     { 
      GenericProps1 gProps1_1 = (GenericProps1)Properties.Settings1.Default; 
      GenericProps1 gProps1_2 = (GenericProps1)Properties.Settings2.Default; 
      //or 
      GenericProps2 gProps2_1 = (GenericProps2)Properties.Settings1.Default; 
      GenericProps2 gProps2_2 = (GenericProps2)Properties.Settings2.Default; 
     } 
    } 

} 
相關問題