2

変更できない 2 つの Web 参照があります。

それらはほとんど同じですが、参照された場合、一方は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;
}

両方のインターフェイスを作成する簡単な方法はありますか?

ティア!

4

3 に答える 3

1

すべてを更新して名前を変更するための適切なリファクタリングがなければ、はい、少しの煙と鏡でできます。希望する新しい値に基づいてインターフェイスを作成し、ゲッター/セッターを使用して元の値を保持し、それを壊さないように変更します。

拡張された質問から拡張するには。 これらの各レベルも調整する必要があります..「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; }
     }

}
于 2012-06-05T16:05:47.433 に答える
1

残念だけど違う。ありません。C# では大文字と小文字が区別されます (インターフェイスを含む)。両方を 1 つのインターフェイスに準拠させるには、名前の大文字と小文字を一致させる必要があります。そうすれば、とにかくクラスは同じになります。

唯一のオプションは、ケーシング メソッドの 1 つを使用するインターフェイスを作成し、それを両方のクラスに実装してから、(選択しなかった命名規則で) 1 つのクラスにコードを追加して呼び出しを渡すことです。

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
}

アップデート

あなたの編集を見た後、物事はより複雑になります。すべての内部クラスに対して同じことを行い、インターフェイスが下位レベルのインターフェイスを参照するようにする必要があります。同じコンセプトで、作業が増えるだけです。

于 2012-06-05T15:35:52.500 に答える
0

これを処理する必要がある場合は、ある型から別の型に変換する拡張メソッドを作成する可能性があります。いくつかの反射は、ほとんどの作業を行います。new Foobar().ToFooBar().ToFoobar()または、常にやり取りするクラスを作成し、最後の時点で適切な実装にアクセスする必要がある場合は、ToFoobar().

于 2012-06-05T15:40:42.383 に答える