2012-02-09 3 views
4

저는 C# 및 Office 자동화에 비교적 익숙하며 최근에 누군가의 Outlook받은 편지함에 대한 참조를 얻고받은 시간순으로 전자 메일을 정렬하려고합니다. Inbox가 Microsoft.Office.Interop.Outlook.Items 유형의 로컬 변수에 할당 된 웹의 다른 곳에서 솔루션을 찾은 다음 정렬이 지역 변수에서 수행되고 작동하면 솔루션이 작동하지 않습니다. 그러나 질문은 왜 그런가? 나는 C# 개체가 참조이고 새로운 Outlook.Inbox 참조를 선언 한 다음 사용자의받은 편지함에있는 항목을 할당 할 때 실제 전자 메일에 대한 추가 포인터로 사용되며 실제로는 각 전자 메일을 복사하지 않는다고 생각했습니다. 새로운 컬렉션으로. 따라서 원본 참조에서 Sort를 호출하는 것과 다를 바가 없습니다. 분명히 나는 ​​틀렸어. 그래서 설명 할께. 고맙습니다! 당신이 기존받은 편지함에 새 참조를 만드는 Outlook.Inbox-C# 및 예기치 않은 결과 참조

using Outlook = Microsoft.Office.Interop.Outlook;  
... 
Outlook.Folder oInbox = (Outlook.Folder)oApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 

oInbox.Items.Sort("[Received]", true); //this doesn't produce expected results 
Outlook.Items inboxFolder = (Outlook.Items)oInbox.Items; 
inboxFolder.Sort("[Received]", true); //this DOES sort the items! 
+0

oInbox.Items의 유형은 무엇입니까? 그 타입이 다른 동작을 가지도록 (듯이) Sort 메소드를 오버라이드 (override) 할 수 있습니다. Outlook.Items로 캐스팅하여 기본 클래스에서 동작을 얻고 있습니다. – cadrell0

답변

6

캐스트를 수행 중입니다 ((Outlook.Items)oInbox.Items). 형변환은 X 유형의 객체를 Y 유형으로 참조하고 있음을 의미합니다. 이것은 다음과 같은 경우에 유효합니다

  • X

    이 (가 Y의 부모 클래스 또는 Y의 하위 클래스 중 하나의 의미) Y의 상속 계층 구조에 있습니다. 실제로 해당 개체가Y (또는 Y에서 파생 형)
  • YX
  • 에 의해 구현되는 인터페이스 유형 인 경우 X는 부모 클래스 인 경우, 캐스트는 런타임에 성공
  • thoug (은 일반적으로이 기능의 동작을 변경하지 않는 첫 번째 경우에, 캐스팅 때문에 다형성의 Y

-X에서 정의 된 명시 적 변환이 있습니다 h 파생 된 유형이 명시 적으로 상위 구현을 숨기는 경우 h 수 있습니다. 그러나 이것이 나의 시나리오라는 것이 나의 의구심입니다. oInbox.Items 유형은 Outlook.Items에서 상속하지만 Outlook.Items.Sort 구현을 숨기는 유형입니다. 명시 적으로 상위 유형으로 캐스팅하면 새 하위 구현을 건너 뜁니다. 이러한 종류의 기술은 자식 가상 함수를 덮어 쓰지 않고 숨 깁니다 ().

X이 사용하려고하는 Y에 함수를 명시 적으로 구현하는 경우 두 번째 경우가 동작을 변경할 수 있습니다. 인터페이스로 형변환하면 컴파일러에게 메소드 호출을 클래스 자체의 일반 공용 메서드가 아닌 인터페이스 구현에 바인딩하도록 명시 적으로 지정합니다.

다른 유형 (따라서 전혀 다른 개체)을 얻으므로 세 번째는 거의 항상 동작을 변경합니다.

Office interop에 대한 경험이 많지 않으므로 이러한 사례 중 어느 것이 해당되는지는 말할 수 없습니다. 그러나이 질문은 "어떻게 다를 수 있습니까?"라는 기본적인 질문에 답해야합니다.

+0

설명해 주셔서 감사합니다. 내가 캐스트 작업을 제거하고 지금 가지고 : (Outlook.Items inboxFolder = oInbox.Items;) 그것은 컴파일하고 잘 실행됩니다, 그리고 내가 정렬을 oInbox.Items에 대한 정렬을 호출 할 때 여전히 정렬 실패하고 inboxFolder 실제로 그것을 정렬에 호출 할 때 올바르게 정렬됩니다. 이것은 매우 이상하며 Google에서 답을 찾지 못했을 때 분류 기준을 추가로 만들지는 못했을 것입니다. –

+0

@MikeItsMe :이 경우 'Outlook.Items'는 ' oInbox.Items', 해당 유형의 상위 클래스 또는 사용할 수있는 암시 적 * 변환이있는 유형. 그러나 당신이 옳다는 점은 확실히 직관력이 떨어지며 잘못된 설계 선택처럼 보입니다. –

+0

Items 속성이 읽기 전용으로 나열된 것으로 나타났습니다. 그것은 내가 왜 그들을 분류 할 수 없는지 설명 할 것이다. 그러나 C#에서는 기본 데이터를 새로운 참조에 할당하여 읽기만하는 것을 피할 수 있습니까? 아니면 상품 재산이 막후에서 복제품을 만들고 있나? 토론을 계속해 주셔서 감사합니다. –

2

당신은 새로운을 만들 수 없습니다. 따라서 정렬은 실제로 기존의받은 편지함에서 수행됩니다.

+0

정확합니다. 그러나 Sort는 원래 참조에서가 아니라 새 참조에서 작동하는 이유는 무엇입니까? 원래받은 편지함이 읽기 전용이고 수정할 수 있도록 모든 항목을 새 모음집에 복사해야한다고 이해할 수 있습니다. 그러나 명시한 것처럼 정렬은 기존받은 편지함에서 수행됩니다. –

+0

아, 그리워. @ AdamRobinson의 대답을 참조하십시오. –