음, 어쨌든 입력의 알고 있다면 당신은 세부 사항과 함께 무엇을 할 것인가?
일반적인 이유 때문에 일반 메서드가 있어야하며 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);
}
}
그리고 : 나는 DataContractSerializer를 사용하는 것이 계획대로
// 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 })
, 내가 만하면 예를 들어
, 여기에 내가 오류 정보를 기록하기 위해 쓴 방법이다 유형을 얻으려는 객체, 그리고 나서 반사가 필요하지 않습니다. 리플렉션을 사용하지 않고 Detail-getter에 대한 액세스 만 필요하지만 가능하지 않은 것 같습니다. –내 코드를 읽었습니까? 정확히 내가하는 일이기 때문입니다. faultExceptionType 변수는 exception.GetType()이고 두 번째 샘플에서는 GetGenericArguments를 호출하여 MakeGenericMethod에 전달합니다. 더 명확하게 코드를 업데이트하겠습니다. –
예 코드를 읽었지만 내 요점은 이것이 여전히 리플렉션을 사용하고 있으며 내가 게시 한 코드 스 니펫에 어떤 이점도 보이지 않는다는 것입니다. –