2014-06-22 3 views
0

하나 있습니다. 내 모든 예외에 대한 기본 클래스가 있습니다. 기본 클래스는 클래스 이름을 기반으로하는 app.config에서 메시지를 검색합니다. 따라서 10 가지 예외가있는 경우 app.config에 10 개의 메시지가 있습니다.하위 클래스 이름을 문자열로 가져 오는 수퍼 클래스 생성자

// EBusinessClassExceptions inherits from ApplicationException 
public EBusinessClassExceptions(string msgType, params object[] objects) 
    : base(string.Format(exceptionMessagesServices.GetMessage(msgType), objects)) 
{ 
} 

따라서 msgType은 찾을 예외의 클래스 이름입니다.

// sub class 
public class EHiddenFromWebException : EBusinessClassExceptions 
{ 
    public EHiddenFromWebException(int sampleID) 
    : base("EHiddenFromWebException", sampleID) 
    { 
    } 
} 

하지만 내가 좋아하지 않는 것은 내가 문자열로 클래스 이름을 사용할 수있는 방법입니다

샘플 서브 클래스입니다. 그래서 더 나은 버전이 있습니다 :

// sub class 
public EHiddenFromWebException(int sampleID) 
    : base(typeof(EHiddenFromWebException).Name, sampleID) 
{ 
} 

내가 문자열로 클래스 이름을 나열하지 않아도이 방법, 그리고 컴파일러는 클래스 이름을 확인합니다. 나는 10 개 예외가 경우에, 각각의 생성자는 동일합니다 - 그냥이 수행합니다

typeof(thisClass).Name 

은 내가 쓸 수 있기를 원하는 것은 단지입니다 :

// sub class 
public EHiddenFromWebException(int sampleID) 
    : base(sampleID) 
{ 
} 

그리고에 대해서 typeof를 부모 생성자. 그러나 이렇게하려면 부모 생성자가 하위 클래스의 클래스 이름을 결정해야합니다. 그리고 그게 내가 갇혀 있어요 ...

이 인스턴스 메서드는 아마 어떻게 든이 사용할 수 있지만 생성자 때문에 붙어 있어요.

편집 - 당신이 사용할 수 없습니다 "이"내부에서 : 나는이 당신을 위해 작동 할 상위 생성자

+0

호기심 반복 템플릿 패턴이 최선의 방법 일 수 있습니다. – siride

+2

기본 클래스 생성자 내에서'this.GetType()'을 사용하여 파생 된 유형을 얻을 수 있지만 런타임에 해결되므로 약간의 성능 오버 헤드가 발생합니다. – MarcinJuraszek

+0

나는 이것을 안으로 사용할 수 없다. base() 나는 두려워한다. – RBrowning99

답변

1

그것은 당신이 base()this를 사용할 수 없다는 사실입니다,하지만 당신은 단지 메시지 속성을 재정의 할 수 있습니다.

public class EBusinessClassExceptions : ApplicationException 
{ 
    public override string Message 
    { 
     get 
     { 
      return this.GetType().ToString(); 
     } 
    } 
} 
+0

AHa - 내가 좋아하는 지금 ... 나는 그것을 시도 할 것이다. 감사. – RBrowning99

0

를 호출 할 필요가 믿습니다 기본(). 파생 클래스의 이름을 기본 클래스의 생성자 안에있는 에서 가져옵니다.

public class EBusinessClassExceptions 
    { 
     public EBusinessClassExceptions(int sampleID) 
     { 
      Type type = GetType(); 
      string name = type.Name; 

      Console.WriteLine("Im gonna get an exception message for {0} with sample {1}", name, sampleID); 
     } 
    } 

    public class EHiddenFromWebException : EBusinessClassExceptions 
    { 
     public EHiddenFromWebException(int sampleID) : base (sampleID) 
     { 

     } 
    } 

    public static void Main() 
    { 
     EHiddenFromWebException ex = new EHiddenFromWebException(123);  

    } 
+0

이봐, 고마워,하지만 어떻게 부모 클래스 생성자를 호출합니까? 내면에서 있어야합니다 : Base 나는 이것을 사용할 수없는 곳이라고 생각합니까? – RBrowning99

+0

왜 부모 클래스 생성자를 호출해야합니까? –

+0

그것은 godo 질문입니다. EBusinessClassException의 부모 클래스는 ApplicationException입니다. 그래서 실제로 예외를 던지는 생성자를 호출합니다. 내가 당신의 생각을 사용한다면, 명시 적으로 거기에서 예외를 던져야 할 것입니다. 나는 그것을 볼 것입니다. 감사합니다 – RBrowning99

관련 문제