2009-12-29 110 views
1

我正在嘗試爲FaultException創建一個ToString - 擴展方法,它也可以處理FaultException <>。 我的問題是,我想包括細節而不使用反射。ToString擴展方法FaultException/FaultException <>

我目前擁有的是:

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

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

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

任何想法,我怎麼可以訪問「詳細信息」 - 屬性,而不雲南財貿,如果我有型的FaultException的對象?

TIA 馬丁

回答

1

那麼,你會怎麼做的詳細介紹,如果你知道它的方式輸入?

因爲它是通用的,所以你必須有一個通用的方法,並使用MethodException,使用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); 
    } 
} 

然後我把它像這樣:

// 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

我打算用DataContractSerializer的,我只需要獲取類型的對象,然後我不需要反射。我只需要訪問細節獲取器而不使用反射,但似乎不可能 – 2009-12-30 15:47:30

+0

您是否閱讀過我的代碼,因爲這正是我正在做的。在我的第二個示例中,faultExceptionType變量是exception.GetType(),然後您會看到我對它調用GetGenericArguments並將它們傳遞給MakeGenericMethod。我會更新代碼以使其更加明顯。 – 2009-12-30 20:12:29

+0

是的,我沒看過你的代碼,但我的觀點是,這仍然是使用反射,我沒有看到我發佈的代碼片段的任何優勢... – 2009-12-31 07:28:12

相關問題