2010-12-29 3 views
3

У меня есть общий класс, который представляет собой документ, который может быть в настоящее время только двух типов. Type1 или Type2. Большинство методов и свойств отлично работают для обоих типов, но название отличается. Что мне интересно, если есть лучший способ справиться с этим? Благодаря!!Является ли это хорошим способом обработки уникальных свойств для общего?

[XmlIgnore] 
public string DocumentType 
{ 
    get 
    { 
    return typeof(T).Name; 
    } 
} 

[XmlIgnore] 
public string DocumentTitle 
{ 
    get 
    { 
    string retval = string.Empty; 
    Object obj = Document; 

    switch (DocumentType) 
    { 
     case "Type1": 
     retval = ((Type1)obj).title.Text; 
     break; 
     case "Type2": 
     retval = ((Type2)obj).Title; 
     break; 
    } 
    return retval; 
    } 
} 

Type1 и Type2 были получены с использованием xsd.exe так стесняюсь, чтобы изменить их, хотя, возможно, добавление только для чтения XML игнорируется свойство, чтобы получить титул в обоих Type1 и типа 2, что согласуется?

ответ

3

Используйте общий интерфейс и реализуйте его в каждом классе. Если вы не хотите менять исходный класс, вы можете попробовать добавить оболочку вокруг каждого класса, который реализует этот интерфейс.

interface IHasTitle 
{ 
    string Title { get; } 
} 

class MyType1 : Type1, IHasTitle 
{ 
    // Add constructors here. 

    public string Title { get { return this.title.Text; } } 
} 

class MyType2 : Type2, IHasTitle 
{ 
    // Add constructors here. 
} 

Тогда вы можете сделать это:

[XmlIgnore] 
public string DocumentTitle 
{ 
    get 
    { 
     IHasTitle hasTitle = Document; 
     return hasTitle.Title; 
    } 
} 

Вы можете расширить интерфейс для IDocument и включают в себя все другие общие элементы, такие как Name и т.д.

+0

Если вы сделаете это, и я думаю, что вам нужно, поставьте ограничитель на T вашего общего класса, что не позволит вам проверить, что документ на самом деле является IHasTitle. –

+0

Я бы использовал частичные классы, если сгенерированный код поддерживает его. Изменение сгенерированных файлов кода обычно плохое Juju. – Toby

1

ли xsd.exe генерировать частичные классы? Если так, ответ Майка чище, чем этот. (Создайте новый файл кода частичного класса для каждого из ваших классов типов и реализуйте интерфейс в негенерированных файлах.)

В противном случае, чтобы не изменять сгенерированный код, я бы рекомендовал использовать безопасное литье для определения типа документа:

public string ExtractDocumentTitle() 
    { 
     Type1 t1 = Document as Type1; 
     if (t1 != null) 
      return t1.title.Text; 

     Type2 t2 = Document as Type2; 
     if (t2 != null) 
      return t2.Title; 


     // fall-through & catch-all 
     return String.Empty; 
    } 
+0

Он генерирует частичные классы, и я бы сделал это, но сгенерированные имена классов не все настолько интуитивно, а не меняют сгенерированные имена классов. Я собираюсь использовать идею обертки. – Mike

0

XSD также может обрабатывать наследование. Определите базовый complexType (возможно, с abstract = "true"), затем создайте 2 complexType, которые расширяют базовый. Если вы создадите код из него, это также отразит это наследование.

Смежные вопросы