2009-12-29 5 views
1

J'essaie actuellement de créer une méthode d'extension ToString pour FaultException, qui peut également gérer FaultException <>. Le problème que j'ai, c'est que je veux inclure les détails sans utiliser de réflexion.ToString Méthode d'extension pour FaultException/FaultException <>

Ce que j'ai actuellement est:

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

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

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

Toute idée comment je peux accéder à la -property « Détail » sans relection, si j'ai un objet de type FaultException?

tia Martin

Répondre

1

Eh bien, que feriez-vous avec le détail si vous saviez c'est de type de toute façon? Parce qu'il est générique, vous devez avoir une méthode générique et utiliser MethodInfo.MakeGenericMethod en utilisant le T de la FaultException comme paramètre générique. Puisque vous ne saurez pas exactement de quel type il s'agit au moment de la compilation, vous devrez d'une certaine manière le coder de façon générique.

À titre d'exemple, voici une méthode que j'ai écrit pour vous connecter détails de défaut:

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); 
    } 
} 

Et puis je l'appelle comme ceci:

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

que je comptais utiliser DataContractSerializer, je ne ai besoin l'objet pour obtenir le type, et je n'ai pas besoin de réflexion alors. J'ai seulement besoin d'accéder au Detail-getter sans utiliser de réflexion, mais il semble que ce ne soit pas possible. –

+0

Avez-vous lu mon code, parce que c'est exactement ce que je fais. La variable faultExceptionType est exception.GetType() dans mon deuxième exemple, puis vous voyez que j'appelle GetGenericArguments sur celle-ci et que je la transmets à MakeGenericMethod. Je vais mettre à jour le code pour le rendre plus évident. –

+0

Oui, j'ai lu votre code, mais ce que je veux dire, c'est que vous utilisez encore la réflexion, et je ne vois aucun avantage à l'extrait de code que j'ai posté ... –

Questions connexes