하나 있습니다. 내 모든 예외에 대한 기본 클래스가 있습니다. 기본 클래스는 클래스 이름을 기반으로하는 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를 부모 생성자. 그러나 이렇게하려면 부모 생성자가 하위 클래스의 클래스 이름을 결정해야합니다. 그리고 그게 내가 갇혀 있어요 ...
이 인스턴스 메서드는 아마 어떻게 든이 사용할 수 있지만 생성자 때문에 붙어 있어요.
편집 - 당신이 사용할 수 없습니다 "이"내부에서 : 나는이 당신을 위해 작동 할 상위 생성자
호기심 반복 템플릿 패턴이 최선의 방법 일 수 있습니다. – siride
기본 클래스 생성자 내에서'this.GetType()'을 사용하여 파생 된 유형을 얻을 수 있지만 런타임에 해결되므로 약간의 성능 오버 헤드가 발생합니다. – MarcinJuraszek
나는 이것을 안으로 사용할 수 없다. base() 나는 두려워한다. – RBrowning99