Microsoft MVP성태의 닷넷 이야기
사용 사례 : 3. XSDObjectGen - partial class 생성 [링크 복사], [링크+제목 복사]
조회: 2480
글쓴 사람
정성태 (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)
37정성태6/7/2016729MSBuild Structured Log: record and visualize your builds
36정성태10/20/20062998SmallTool ver 1.0.1.2 - 변경된 점
34정성태7/27/20062388SmallTool ver 1.0.1.1 - 변경된 점
35정성태7/27/20062297    답변글 SourceGDN].0.060717.001 - 변경된 소스파일 다운로드1
33정성태7/24/20062377SmallTool ver 1.0.1.0 - 변경된 점.
32정성태6/30/20062400사용 사례 : 7. 스키마 상속 처리 (3)
30정성태6/27/20063147사용 사례 : 6. 스미카 상속 처리 (2)
29정성태6/27/20062183사용 사례 : 5. ConsoleBat.exe - Path가 설정되어 있는 Command 창 이용하기
28정성태6/27/20062611사용 사례 : 4. 스미카 상속 처리 (1)파일 다운로드1
27정성태6/27/20062480사용 사례 : 3. XSDObjectGen - partial class 생성파일 다운로드1
26정성태6/29/20062325사용 사례 : 2. XSDObjectGen - Enum 처리에 대한 기능 향상파일 다운로드1
31정성태6/29/20062467    답변글 사용 사례 : 2.1 XSDObjectGen - Enum 처리 방식 변경
25정성태6/23/20062847사용 사례 : 1. VS.NET 통합 환경에서 XSDObjectGen 실행
24정성태6/23/20062344자동 로그인 ver 1.53파일 다운로드1
22정성태6/18/20062431ST : XSDObjectGen 1.4.2.1 포함
23정성태6/18/20062414    답변글 XSDObjectGen 1.4.2.1 - 커스터마이징파일 다운로드1
20정성태1/4/20073572ST: NDoc 2.0 한글 지원 버전
21정성태5/26/20062822    답변글 [답변]: ST: NDoc 2.0 한글 지원 버전 (업데이트)
19정성태5/18/20064123ST: ROBOCOPY.exe
18정성태4/20/20062561자동 로그인 ver 1.52 [2]파일 다운로드1
11정성태2/14/20047145폴더 백업( 동기화 ) 프로그램 [5]파일 다운로드1
7정성태7/24/20033041IExtender : Internet Explorer 확장툴 [2]
8정성태8/4/20032447    답변글 제거방법
6정성태7/23/20035343성태의 사이트 로그인 보안 구현: SysnetLogin
5정성태12/24/20043493성태의 게시판 구현이론: SysnetBoard
[1]  2