2009-12-29 3 views
1

현재 FaultException에 대한 ToString - 확장 메서드를 만들려고합니다.이 메서드는 FaultException <>도 처리 할 수 ​​있습니다. 내가 가진 문제는 리플렉션을 사용하지 않고 세부 정보를 포함하고자한다는 것입니다.FaultException/FaultException에 대한 ToString 확장 메서드 <>

내가 현재 가지고 있습니다 : I 유형의 오류 예외의 목적이있는 경우 나, relection없이 "상세"-property에 액세스 할 수있는 방법을

if (ex.GetType() == typeof(FaultException<>)) 
{ 
    var prop = ex.GetType().GetProperty("Detail"); 

    if (prop == null) 
    return ex.ToString(); 

    object details = prop.GetValue(ex, null); 
} 

어떤 생각?

TIA 마틴

답변

1

음, 어쨌든 입력의 알고 있다면 당신은 세부 사항과 함께 무엇을 할 것인가?

일반적인 이유 때문에 일반 메서드가 있어야하며 FaultException T를 제네릭 매개 변수로 사용하여 MethodInfo.MakeGenericMethod를 사용해야합니다. 여러분은 컴파일 타임에 정확히 어떤 타입인지 알지 못할 것이기 때문에 어쨌든 어떤 의미에서 그것을 일반적으로 코딩해야합니다. 내가 그렇게 같이 호출 다음

private static void WriteGenericFaultExceptionDetail<T>(FaultException faultException, StringBuilder faultDetailsBuilder) 
{ 
    FaultException<T> faultExceptionWithDetail = (FaultException<T>)faultException; 

    DataContractSerializer dataContractSerializer = new DataContractSerializer(typeof(T)); 

    using(StringWriter writer = new StringWriter(faultDetailsBuilder)) 
    using(XmlWriter xmlWriter = XmlWriter.Create(writer)) 
    { 
     dataContractSerializer.WriteObject(xmlWriter, faultExceptionWithDetail.Detail); 
    } 
} 

그리고 : 나는 DataContractSerializer를 사용하는 것이 계획대로

// NOTE: I actually cache this in a static field to avoid the constant method lookup 
MethodInfo writeGenericFaultExceptionDetailMethodInfo = typeof(MyClass).GetMethod("WriteGenericFaultExceptionDetail", BindingFlags.NonPublic|BindingFlags.Static); 

Type faultExceptionType = myFaultException.GetType(); 

writeGenericFaultExceptionDetailMethodInfo.MakeGenericMethod(faultExceptionType.GetGenericArguments()).Invoke(null, new object[] { myFaultException, myTraceBuilder }) 
+0

, 내가 만하면 예를 들어

, 여기에 내가 오류 정보를 기록하기 위해 쓴 방법이다 유형을 얻으려는 객체, 그리고 나서 반사가 필요하지 않습니다. 리플렉션을 사용하지 않고 Detail-getter에 대한 액세스 만 필요하지만 가능하지 않은 것 같습니다. –

+0

내 코드를 읽었습니까? 정확히 내가하는 일이기 때문입니다. faultExceptionType 변수는 exception.GetType()이고 두 번째 샘플에서는 GetGenericArguments를 호출하여 MakeGenericMethod에 전달합니다. 더 명확하게 코드를 업데이트하겠습니다. –

+0

예 코드를 읽었지만 내 요점은 이것이 여전히 리플렉션을 사용하고 있으며 내가 게시 한 코드 스 니펫에 어떤 이점도 보이지 않는다는 것입니다. –

관련 문제