Интерфейс для двух почти идентичных веб-ссылок в C#

У меня есть 2 веб-ссылки, которые я не могу изменить:

Они почти идентичны, но при ссылке одна принимает только ProperCase, а другая - Uppercamelcase.

пример

Дело не только в реквизитах, но и во всех классах с их реквизитами и методами.

@EDIT: Извините, я понял, что это сложнее, чем первоначально заявлено:

Дело не только в реквизитах, но и во всех классах с их реквизитами, методами и внутренними классами. Внутренние классы, используемые только как структуры, имеют ту же проблему.

public class Foobar
{
     public string Logmsgno;
     public string Revno;
     public string Reqsox;
     public void Dosomething();
     public Barbaz Mybarbaz;
     public List<quux> Myquuxlist;
}

А другой имеет такие имена, как

public class FooBar
{
     public string LogMsgNo;
     public string RevNo;
     public string ReqSox;
     public void DoSomething();
     public BarBaz MyBarBaz;
     public List<Quux> MyQuuxList;
}

Есть ли простой способ сделать интерфейс для обоих?

ТИА!

3 ответа

Решение

Без надлежащего повторного факторинга, чтобы обновить все и изменить имена, да, вы могли бы с небольшим количеством дыма и зеркал. Создайте интерфейс, основанный на НОВЫХ значениях, которые вы хотите, чтобы они были, затем измените их, чтобы соответственно использовать getter/setter, чтобы сохранить оригинал и не нарушать его.

Чтобы расширить от вашего расширенного вопроса. Вам также придется настроить каждый из этих уровней. Определите интерфейс для классов "Barbaz" и "BarBaz", чтобы ваш внешний класс мог иметь объект

public interface IYourBarBazInterface
{
     string BarBazProp1 { get; set; }
     string AnotherProp { get; set; }
}

public interface IQuux
{
    int QuuxProp { get; set; }
    string AnotherQuuxProp { get; set; }
}

public interface IYourCommonInterface
{
     string LogMsgNo { get; set; };
     string RevNo { get; set; };
     string ReqSox { get; set; };

     // Similar principle of declarations, but interface typed objects
     IYourBarBazInterface MyBarBaz { get; set; }
     List<IQuux> MyQuuxList;
     void DoSomething();
}



public class Foobar : IYourCommonInterface
{
     public string Logmsgno;
     public string Revno;
     public string Reqsox;
     public void Dosomething();

     // your existing old versions keep same name context
     // but showing each of their respective common "interfaces"
     public IYourBarBazInterface mybarbaz;
     public List<IQuux> myQuuxlist = new List<IQuux>();


     // these are the implementations of the interface...
     public string LogMsgNo
     { get { return Logmsgno; }
       set { Logmsgno = value; }
     }

     public string RevNo
     { get { return Revno; }
       set { Revno = value; }
     }

     public string ReqSox
     { get { return Reqsox; }
       set { Reqsox = value; }
     }

     public void DoSomething()
     { Dosomething(); }

     // Now, the publicly common Interface of the "IYourCommonInterface"
     // that identify the common elements by common naming constructs.
     // similar in your second class.
     public IYourBarBazInterface MyBarBaz 
     { get { return mybarbaz; }
       set { mybarbaz = value; }
     }

     public List<IQuux> MyQuuxList
     { get { return myQuuxlist; }
       set { myQuuxlist = value; }
     }
}


public class FooBar : IYourCommonInterface
{
     // since THIS version has the proper naming constructs you want,
     // change the original properties to lower case start character
     // so the interface required getter/setter will be properly qualified

     public string logMsgNo;
     public string revNo;
     public string reqSox;

     public IYourBarBazInterface MyBarbaz;
     public List<IQuux> Myquuxlist;



     // these are the implementations of the interface...
     public string LogMsgNo
     { get { return logMsgMo; }
       set { logMsgNo = value; }
     }

     public string RevNo
     { get { return revNo; }
       set { revNo = value; }
     }

     public string ReqSox
     { get { return reqSox; }
       set { reqSox = value; }
     }


     // Since your "DoSomething()" method was already proper case-sensitive
     // format, you can just leave THIS version alone
     public void DoSomething()
     { .. do whatever .. }



     public IYourBarBazInterface MyBarBaz 
     { get { return MyBarbaz; }
       set { MyBarbaz = value; }
     }

     public List<IQuux> MyQuuxList
     { get { return myquuxlist; }
       set { myquuxlist = value; }
     }

}

К сожалению нет. Нет. C# чувствителен к регистру (включая интерфейсы). Чтобы они оба соответствовали одному интерфейсу, регистр имен должен совпадать. Если бы вы сделали это, классы были бы такими же.

Единственным вариантом будет создание интерфейса, в котором используется один из методов оболочки, реализация его в обоих классах, а затем добавление кода в один класс (с соглашением об именах, которое вы не выбрали) для прохождения вызовов:

public interface IFooBar
{
    string LogMsgNo { get; set; }
    string RevNo { get; set; }
    string ReqSox { get; set; }
    void DoSomething();
}

public class Foobar : IFooBar
{
    public string Logmsgno;
    public string Revno;
    public string Reqsox;
    public void Dosomething();

    public string LogMsgNo
    {
        get { return Logmsgno; }
        set { Logmsgno = value; }
    }

    // And so on
}

ОБНОВИТЬ

После просмотра ваших изменений все становится намного сложнее. Вы должны будете сделать то же самое со всеми внутренними классами, и тогда ваши интерфейсы будут ссылаться на интерфейсы более низкого уровня. Та же концепция, просто больше работы.

Если бы мне пришлось справиться с этим, я бы, вероятно, написал метод расширения для преобразования из одного типа в другой. Некоторое отражение сделало бы большую часть работы. new Foobar().ToFooBar().ToFoobar() Или напишите класс, с которым я всегда буду взаимодействовать, и в последний момент вам нужно получить доступ к правильной реализации, вызвать ToFoobar(),

Другие вопросы по тегам