那麼,你會怎麼做的詳細介紹,如果你知道它的方式輸入?
因爲它是通用的,所以你必須有一個通用的方法,並使用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 })
我打算用DataContractSerializer的,我只需要獲取類型的對象,然後我不需要反射。我只需要訪問細節獲取器而不使用反射,但似乎不可能 – 2009-12-30 15:47:30
您是否閱讀過我的代碼,因爲這正是我正在做的。在我的第二個示例中,faultExceptionType變量是exception.GetType(),然後您會看到我對它調用GetGenericArguments並將它們傳遞給MakeGenericMethod。我會更新代碼以使其更加明顯。 – 2009-12-30 20:12:29
是的,我沒看過你的代碼,但我的觀點是,這仍然是使用反射,我沒有看到我發佈的代碼片段的任何優勢... – 2009-12-31 07:28:12