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 })
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. –
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. –
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é ... –