2012-09-14 2 views
2

간략한 클래스는 아래와 같습니다. 모든 네임 스페이스는 별도의 .cproj에 있습니다. z.exe를 빌드 할 때 "B가 참조되지 않은 어셈블리에 정의되었습니다"라는 문제점이 있습니다.C# 생성자 오버로드 + 명시 적 캐스팅 = .dll 참조 없음

모든 z에 y.dll을 포함하고 싶지 않기 때문에 ctor A (문자열 s)를 추가했습니다. z가 많습니다. 엉망으로이 작업을 수행하는 방법은 무엇입니까?

한 가지 방법은 A (B b) 또는 A (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); 
     } 
    } 
+0

부분 수업을 사용해 보셨나요? – elyashiv

+0

@elyashiv 부분 수업이 어떻게 도움이 될지 모르겠습니다. 아이디어에 대해 더 설명해 주시겠습니까? – watbywbarif

+0

은 부분적으로'A'를 선언하고'y.dll'에서'A (B b)'를 선언합니다. – elyashiv

답변

2

내가 이것을 달성하기 위해 알고있는 유일한 방법은 내부 생성자 두 번째 확인하는 것입니다 :

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

이 생성자를 사용할 필요가 다른 어셈블리가있는 경우; InternalsVisibleTo 속성을 사용할 수 있습니다.

+0

이것은 좋은 속임수입니다. 나는 단지 얼마나 많은 친구들이 있는지보고 내 친구들이 아닌 사람들을 위해 더 좋은 매개 변수 또는 가짜 매개 변수를 결정할 것입니다.) – watbywbarif

+0

@watbywbarif, 예, 친한 친구에게만 제한하는 것이 가장 좋습니다 :) 몇 개가 넘는 경우 디자인을 재고하고 B를 A와 동일한 어셈블리로 옮길 수 있습니다. – Joe

1

이유는 다음 원치 않는 생성자를 숨기는 A로부터 또 다른 클래스를 파생하지?

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

다음으로 namespace/assembly에서 ADerived을 사용 하시겠습니까?

+0

이것은 확실한 한 가지 방법이지만 많은 A가있는 경우에도 실용적이지 않습니다. – watbywbarif

1

클래스 A는 B를 (생성자 매개 변수로) 참조하므로 클래스 A를 사용하는 모든 요소는 빌드 할 클래스 B도 알아야합니다.

그러나 코드를 작성하려면 A 클래스 선언 앞에 using y;이 누락되었습니다.

+0

생성자가 다른 개수의 매개 변수를 갖는 경우에는 사실이 아닙니다. Z에서 필요한 B에 대한 언급이 없으므로 시도했습니다. y를 이용해 주셔서 감사합니다! – watbywbarif

+0

맞아요,이 경우 빌드하지 않습니다 ~ – Paciv

+0

기본 값을 가진 여분의 더미 인수를 사용하여 빌드하면 너무 멋지 겠지만 작동하지 않습니다. ( – watbywbarif

관련 문제