2

簡略化されたクラスは以下のとおりです。すべての名前空間は個別の .cproj にあります。z.exe をビルドするときに、「参照されていないアセンブリで B が定義されています」という問題があります。

ctor A(string s) を追加したのは、すべての z に y.dll を含めたくないためです (z がたくさんあります)。混乱なくこれを機能させるにはどうすればよいですか?

1つの方法は、 A(B b) または A(string s) に別の引数を追加して、異なる数の引数を持つようにすることですが、これは私には良くありません。

    //namespace x
    using y;
    public class A
    {
        public A(string s)
        public A(B b)
    }

    //namespace y
    public class B
    {
        public static explicit operator B(string s)
    }

    //namesapce z
    using x;
    public class C
    {
        void M()
        {
            string s = "";
            A(s);
        }
    }
4

3 に答える 3

2

これを達成するために私が知っている唯一の方法は、2番目の A コンストラクターを内部にすることです。

//namespace x     
public class A     
{         
    public A(string s)         
    internal A(B b)     
}

このコンストラクターを使用する必要がある他のアセンブリがある場合。属性の使用を検討できInternalsVisibleToます。

于 2012-09-14T09:36:14.700 に答える
1

クラス A は B を (コンストラクターのパラメーターとして) 参照するため、クラス A を使用するものはすべて、構築するためにクラス B を知る必要があります。

ところで、コードをビルドするusing y;には、A クラス宣言の前に欠落があります。

于 2012-09-14T09:23:53.007 に答える
1

A から別のクラスを派生させて、不要なコンストラクターを隠してみませんか?

public class ADerived : A
{
    public ADerived(string s) : base (s)
    {
    }
}

ADerived名前空間/アセンブリzから使用しますか?

于 2012-09-14T09:14:34.087 に答える