FaultException / FaultException的ToString扩展方法<>

时间:2009-12-29 15:00:29

标签: wcf reflection

我目前正在尝试为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 马丁

1 个答案:

答案 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 })