我目前正在尝试为FaultException创建一个ToString扩展方法,它也可以处理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类型的对象,我知道如何在不重新选择的情况下访问“Detail”属性吗?
TIA 马丁
答案 0 :(得分:1)
那么,如果您知道它的类型,您会对细节做什么?
因为它是通用的,你必须有一个泛型方法并使用MethodInfo.MakeGenericMethod,使用FaultException的T作为泛型参数。由于您无法确切知道它在编译时的类型,因此无论如何您都必须在某种意义上对其进行编码。
作为一个例子,这是我写的一个记录故障细节的方法:
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 })