성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
버전 업
사용 사례
개발자 대상
일반인 대상
기타
부모글 보이기/감추기
내용
partial 클래스 추가<br /> <br /> .NET 2.0으로 오면서 "partial" 예약어가 추가되었습니다. 어떤 용도로 사용되는지는 다 아실 테니, 더 이상 구구절절이 설명하지 않겠습니다.<br /> <br /> partial 클래스의 위력이 나오는 것이, 바로 "자동 생성된 코드"에 개발자가 특별한 목적으로 부가 코드를 넣어야 할 때입니다. XSDObjectGen.exe로 XSD 파일을 cs 파일로 변환하는 경우가 그렇다고 볼 수 있겠지요. ^^<br /> <br /> 때로는, 자동 생성된 클래스에 원하는 함수를 집어넣고 싶은 경우가 있습니다.<br /> 예를 들어, 해당 클래스를 위한 Serialize 함수가 그것인데요. 그 커스텀 코드를 자동 생성 파일에 직접 써 넣었다가는 ^^ 나중에 또다시 생성되는 시점에 모든 커스텀 코드가 날아가 버리기 때문에 그렇게 해서는 안되는데요.<br /> <br /> 그런 코드를 집어 넣기 위해 ^^ SmallTool 1.0.0.6부터 제공되는 XSDObjectGen에는 모든 클래스를 "partial"로 정의를 해주게 되어 있습니다.<br /> <br /> 지난번의 XSD 예제를 한번 볼까요!<br /> <br /> <pre class="code"> <?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> </pre> <br /> 지난번 예제와 비교해서, Collection 클래스가 생성되도록 하는 부분만 추가되었을 뿐입니다. 위의 XSD 파일을 SmallTool 1.0.0.6에서 제공되는 XSDObjectGen에 통과시키면 다음과 같은 코드 구조가 생성됩니다.<br /> <br /> <pre class="code"> 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 { // 중간 생략 } </pre> <br /> 이제, 여러분이 원하는 기능을 추가하고 싶다면, 새로운 CS 파일을 하나 더 생성하고, 동일한 partial class를 만들어 주시면 됩니다. 물론, 새로운 partial class에는 원하는 인터페이스 상속을 하도록 만들 수도 있을 것입니다. 가령, ISerialzable 인터페이스 같은 것들이 되겠지요. ^^<br /> <br /> <hr /> 첨부된 예제 솔루션은, 위의 partial class 확장을 통해서 Binary Serialize를 구현하는 예를 보여주고 있습니다.<br /> 코드가 그리 크지 않고 어렵지 않으니, 쉽게 보실 수 있을 것 같아서 설명은 생략합니다. 그냥 컴파일 한 번 하고, F5 디버깅으로 한줄 한줄 따라가시면 금새 이해하실 수 있을 것입니다. ^^
첨부파일
스팸 방지용 인증 번호
1354
(왼쪽의 숫자를 입력해야 합니다.)