Microsoft MVP성태의 닷넷 이야기
사용 사례 : 3. XSDObjectGen - partial class 생성 [링크 복사], [링크+제목 복사],
조회: 2484
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

partial 클래스 추가

.NET 2.0으로 오면서 "partial" 예약어가 추가되었습니다. 어떤 용도로 사용되는지는 다 아실 테니, 더 이상 구구절절이 설명하지 않겠습니다.

partial 클래스의 위력이 나오는 것이, 바로 "자동 생성된 코드"에 개발자가 특별한 목적으로 부가 코드를 넣어야 할 때입니다. XSDObjectGen.exe로 XSD 파일을 cs 파일로 변환하는 경우가 그렇다고 볼 수 있겠지요. ^^

때로는, 자동 생성된 클래스에 원하는 함수를 집어넣고 싶은 경우가 있습니다.
예를 들어, 해당 클래스를 위한 Serialize 함수가 그것인데요. 그 커스텀 코드를 자동 생성 파일에 직접 써 넣었다가는 ^^ 나중에 또다시 생성되는 시점에 모든 커스텀 코드가 날아가 버리기 때문에 그렇게 해서는 안되는데요.

그런 코드를 집어 넣기 위해 ^^ SmallTool 1.0.0.6부터 제공되는 XSDObjectGen에는 모든 클래스를 "partial"로 정의를 해주게 되어 있습니다.

지난번의 XSD 예제를 한번 볼까요!

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="DataTypes" targetNamespace="http://tempuri.org/DataTypes.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/DataTypes.xsd" xmlns:mstns="http://tempuri.org/DataTypes.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="TFSAddItemT">
    <xs:attribute name="Name" type="xs:string" />
    <xs:attribute name="Port" type="xs:int" />
    <xs:attribute name="Protocol" type="ProtocolEnum" />
  </xs:complexType>
  <xs:simpleType name="ProtocolEnum">
    <xs:restriction base="xs:short">
      <xs:enumeration id="HTTP" value="80" />
      <xs:enumeration id="HTTPS" value="8080" />
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="CollectionDef">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="TFSAddItemList" type="TFSAddItemT" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

지난번 예제와 비교해서, Collection 클래스가 생성되도록 하는 부분만 추가되었을 뿐입니다. 위의 XSD 파일을 SmallTool 1.0.0.6에서 제공되는 XSDObjectGen에 통과시키면 다음과 같은 코드 구조가 생성됩니다.

public partial class Declarations
{
	public const string SchemaVersion = "http://tempuri.org/DataTypes.xsd";
}

[Serializable]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public partial class TFSAddItemTCollection : ArrayList
{
        // 중간 생략
}

[XmlType(TypeName="TFSAddItemT",Namespace=Declarations.SchemaVersion),Serializable]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public partial class TFSAddItemT
{
        // 중간 생략
}

[XmlRootElementName="CollectionDef",Namespace=Declarations.SchemaVersion,IsNullable=false),Serializable]
public partial class CollectionDef
{
        // 중간 생략
}

이제, 여러분이 원하는 기능을 추가하고 싶다면, 새로운 CS 파일을 하나 더 생성하고, 동일한 partial class를 만들어 주시면 됩니다. 물론, 새로운 partial class에는 원하는 인터페이스 상속을 하도록 만들 수도 있을 것입니다. 가령, ISerialzable 인터페이스 같은 것들이 되겠지요. ^^


첨부된 예제 솔루션은, 위의 partial class 확장을 통해서 Binary Serialize를 구현하는 예를 보여주고 있습니다.
코드가 그리 크지 않고 어렵지 않으니, 쉽게 보실 수 있을 것 같아서 설명은 생략합니다. 그냥 컴파일 한 번 하고, F5 디버깅으로 한줄 한줄 따라가시면 금새 이해하실 수 있을 것입니다. ^^






[최초 등록일: ]
[최종 수정일: 7/10/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  [2] 
NoWriterDateCnt.TitleFile(s)
5정성태12/24/20043496성태의 게시판 구현이론: SysnetBoard
9이일렬1/6/20042753    답변글 [답변]: 성태의 게시판 구현이론: SysnetBoard
10정성태1/17/20041516        답변글 [답변]: 성태의 게시판 구현이론: SysnetBoard
14정성태12/24/20041609    답변글 [답변]: SQL Server 2005 에서 달라지는 쿼리
16정성태5/17/20051391    답변글 Improving Application Performance by Implementing Paginated Lists
4정성태7/23/20032211리스트 ActiveX 컨트롤 ( XML 데이터 기반 )
3정성태7/23/20032539트리 ActiveX 컨트롤 ( XML 데이터 기반 ) [2]
2정성태7/23/20033333문자열 암호화 (RSA, MD5, 대칭) COM 개체
13이강구4/28/20042222    답변글 [질문]: 문자열 암호화 ( RSA, MD5, 대칭 ) COM 개체
15정성태3/4/20051744        답변글 [답변]: [질문]: 문자열 암호화 ( RSA, MD5, 대칭 ) COM 개체
1정성태7/23/20032358멋있는 바탕화면 설치 프로그램파일 다운로드1
1  [2]