2010-02-11 8 views
3

오류 클래스를 만들고 싶습니다. 그리고 정적 속성을 가지고 있습니다. 예 : Message, InnerException, Stacktrace, Source. 하지만 몇 가지 동적 속성을 추가하고 싶습니다.클래스에 속성을 동적으로 추가하는 방법

예외가 FileNotFoundException 인 경우 FileName 속성을 추가하고 싶습니다.

또는 SqlException 인 경우 LineNumber 속성을 추가하고 싶습니다. Exception에서 클래스를 상속받을 수 없기 때문에 웹 서비스에서 해당 클래스를 반환합니다. 어떻게해야합니까?

답변

1
동적 익명 형식과 같은 C#으로 새로운 기능을 사용하여

난 당신이 유사한 몇 가지 일을하려고하지만,

 public interface IError { } 

     public class ErrorTypeA : IError 
     { public string Name; } 

     public class ErrorTypeB : IError 
     { 
      public string Name; 
      public int line; 
     } 

     public void CreateErrorObject() 
     { 
      IError error; 
      if (FileNotFoundException) // put your check here 
      { 
       error = new ErrorTypeA 
        { 
         Name = "" 
        }; 
      } 
      elseif (InValidOpertionException) // put your check here 
      { 
       error = new ErrorTypeB 
       { 
        Name = "", 
        line = 1 
       }; 
      } 
     } 

희망을 다음과 같이 요구 사항을 달성 할 수 있는지 확실하지 않다 유형을 만들 수 있습니다

도움이

+0

그래서 당신은 예외를 잡는거야 그리고 그것을 포장? 이것은 예외를 처리하는 매우 나쁜 방법입니다 (호출 코드는 항상 반환 값을 확인하고 예외를 처리해야합니다). 이로 인해 소비자 코드가 있어야 할 때보 다 까다로워집니다. –

+0

이 포스터의 요점은 예외 처리를위한 모범 사례가 아닙니다! 질문을 다시 검토하십시오. –

0

달성하려는 목표가 명확하지 않습니다. 비 정적 클래스를 사용하여 디자인을 재검토하고 상속을 사용하십시오.

그리고 .NET BCL에는 기성품 예외 클래스가 많이 있다는 것을 기억 하시겠습니까?

2

C#은 정적으로 입력 된 언어입니다. 이것은 당신이 일반적으로 동적 인 속성을 런타임에 클래스에 동적으로 추가 할 수 없다는 것을 의미합니다 (확실히 피하고 싶습니다).

귀하의 경우에는 예외를 조금 더 잘 이해할 필요가있는 것처럼 보입니다. 보통 예외적 인 문제의 원인을 나타 내기 위해 특정 유형의 예외를 던집니다. 예를 들어, 파일을 찾고 있고 거기에없는 경우 FileNotFoundException을 던지거나 응용 프로그램 특정 문제가있는 경우 자체 예외 클래스를 만들어 해당 예외를 throw 할 수 있습니다.

예외는 예외적이어야합니다.

+0

익명의 유형을 들어 본 적이 있습니까? –

+0

그래, 들어 봤어 - 당신은 익명의 예외를 만들 수 없다 비록 –

2

대신에 아주 잘 처리하지 않습니다 현재 뭔가 C# .NET을하려고 노력의 확인, 난 당신이 다소 다른 접근 방식을 제안한다.

사전에 추가 속성을 데이터로 추가하지 않는 이유는 무엇입니까? 클래스가 인터페이스를 노출하여 여러 속성 (단어의 일반적인 의미)을 가져올 수 있습니다. 즉, 키와 호출 코드는이를 검사하여 필요에 따라 값을 조회 할 수 있습니다.

0

Exception에서 파생 된 새 예외 유형을 만듭니다. 이 예외를 던져 InnerException 속성을 모든 일촉즉아 한 예외로 설정합니다.

내부 예외의 유형을 확인하고 이에 따라 데이터를 표시 할 수 있습니다.

발신자가 처리 할 수있는 경우 원래 throw 일 수도 있습니다.

1

내 모든 데이터를 저장할 수있는 사전을 사용하는 것이 좋습니다.

public class Logging 
{ 
    private Dictionary<string, string> _ExtraInfo = new Dictionary<string, string>(); 

    public Dictionary<string, string> ExtraInfo { 
     get { return _ExtraInfo; } 
     set { _ExtraInfo = value; } 
    } 

} 

사용하려면, 등등

Logging MyLogger = new Logging(); 
    MyLogger.ExtraInfo.Add("Filename", thefilename); 
    MyLogger.ExtraInfo.Add("ClientTime", now); 

그리고있다.

관련 문제