.NET Framework의 Xml.Schema 클래스를 사용하여 XML 스키마를 처리하는 C# 코드가 있습니다. Xml.Schema.XmlSchemaFacet에서 파생 된 클래스의 전체 집합으로서 다양한 단순 유형 제한이 프레임 워크에서 추상화됩니다. 필자가 놓친 바가 없으면 파생 된 패싯 유형 중 어떤 패싯 유형을 알 수있는 유일한 방법은 실패한 경우 결과로 발생하는 InvalidCastOperation을 잡아내어 추론하여 그 중 하나에 캐스팅하는 것입니다. 이렇게하면 다음과 같은 추악한 함수가 생깁니다.try-and-catch-wrapped 투기 캐스팅 작업의 긴 체인을 리팩토링하는 방법
private void NavigateFacet(XmlSchemaFacet facet)
{
try
{
handler.Length((XmlSchemaLengthFacet)facet);
}
catch(InvalidCastException)
{
try
{
handler.MinLength((XmlSchemaMinLengthFacet)facet);
}
catch(InvalidCastException)
{
try
{
handler.MaxLength((XmlSchemaMaxLengthFacet)facet);
}
catch(InvalidCastException)
{
...
}
}
}
}
이렇게하려면 좀 더 우아한 방법이 있어야한다고 가정합니다. .NET 프레임 워크에서 놓친 일부 속성 또는 OO 속임수의 영리한 조각을 사용합니다. 누구나 나를 계몽시킬 수 있습니까?
I * really *이 모양을 좋아합니다. 지금 내 코드에서 그것을 시험해보고 있는데, 들어간 후에 upvote로 되돌아 올 것이다. –
와우, 다시 한번 고마워. 잘 작동하고 코드가 훨씬 깨끗 해졌다. 또한 사용자가 지정하면 새 코드가 더 빨리 실행됩니다. 이 변경으로 시스템의 단위 테스트 수가 늘어 났지만 NUnit이보고 한 시간은 상당히 줄었습니다. 내가 한 번 이상 upvote 수 있다면, 나는 것입니다. :) –
+1 * 많이 * 여기 다른 모든 답변보다. 이것이 내가 Bevan의 대답에 대한 제 코멘트에서 바라는 바입니다. – MusiGenesis