C# несколько файлов настроек с тем же интерфейсом
-
19-09-2019 - |
Вопрос
Я пытаюсь создать программу с двумя (или более) дискретными наборами настроек, которые оба соответствуют одному и тому же интерфейсу. Особенно я хотел бы сделать что -то вроде следующего, используя созданные дизайнерские настройки:
IMySettings settings = Properties.A;
Console.WriteLine(settings.Greeting);
settings = Properties.B;
Console.WriteLine(settings.Greeting);
Это было бы тривиально с интерфейсами GO, потому что любой класс (?), Который, который предоставляет методы, можно назначить, но как я могу реализовать это в C#, с его строгими правилами реализации интерфейса?
Примечание: C#/. Net 2.0
Решение
Свойства. Класс, сгенерированный в VS, не позволит вам сделать это. Рассмотрите возможность определения простого класса DTO и отметить его XMLattribute, чтобы вы могли легко покинуть его.
Другие советы
Вы также можете использовать интерфейсы в C#.
Тем не менее, вам придется написать фасадный класс, если вы все еще хотите использовать настройки, созданные дизайнером.
Я не уверен, что вы спрашиваете, как реализовать интерфейс в 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;
Я не уверен, сможете ли вы сделать то, что вы через дизайнерские настройки, но я не использую их часто, чтобы я мог ошибаться. Тем не менее, есть и другой способ сделать это: создание собственного Конфигурация.
Вот пример:
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>
Там могут быть опечатки в этом, но общая идея есть. Надеюсь, это поможет.
Вы можете использовать пользовательский генератор кода для вставки вашего интерфейса в сгенерированный код (используя метод здесь: 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;
}
}
}