2009-11-25 86 views
0

我有一個接口,並且定義了與該接口具有相同類型的屬性。從具有屬性類型的接口繼承的可序列化的類

public interface IMyInterface 
{ 
    IMyInterface parent 
    { 
     get; 
     set; 
    } 
} 

現在,如果我聲明一個類並從接口繼承,我需要創建一個名爲parent的屬性。我希望我的類可以在Web服務中使用,但在使用這種方式時,Interfaces不可序列化,那麼我應該如何處理IMyInterface類型的屬性?我確實希望該屬性可以序列化。

回答

0

未測試:當您使用XmlSerialization時,您可以嘗試用所有已知實現的[XmlElement]屬性修飾您的Property。

public interface IMyInterface 
{ 
    [XmlElement(Type=typeof(App.Projekt), ElementName="Projekt")] 
    [XmlElement(Type=typeof(App.Person), ElementName="Person")] 
    [XmlElement(Type=typeof(App.Task), ElementName="Task")] 
    IMyInterface parent 
    { 
     get; 
     set; 
    } 
} 

未測試 - 我不知道這是否也適用於接口。

編輯:我用這段代碼測試了這個問題。它沒有工作。我認爲,XmlElement會和「object」類型的Property一樣。

public interface IMyInterface 
{ 
    IMyInterface Parent { get; set; } 
    string Name { get; set; } 
} 

public class ClassA : IMyInterface 
{ 
    [XmlElement(Type = typeof(ClassA), ElementName = "ClassA")] 
    [XmlElement(Type = typeof(ClassB), ElementName = "ClassB")] 
    [XmlElement(Type = typeof(ClassC), ElementName = "ClassC")] 
    public IMyInterface Parent { get; set; } 
    public string Name { get; set; } 

    public string AProperty { get; set; } 
} 

public class ClassB : IMyInterface 
{ 
    [XmlElement(Type = typeof(ClassA), ElementName = "ClassA")] 
    [XmlElement(Type = typeof(ClassB), ElementName = "ClassB")] 
    [XmlElement(Type = typeof(ClassC), ElementName = "ClassC")] 
    public IMyInterface Parent { get; set; } 
    public string Name { get; set; } 

    public string BProperty { get; set; } 
} 

public class ClassC : IMyInterface 
{ 
    [XmlElement(Type = typeof(ClassA), ElementName = "ClassA")] 
    [XmlElement(Type = typeof(ClassB), ElementName = "ClassB")] 
    [XmlElement(Type = typeof(ClassC), ElementName = "ClassC")] 
    public IMyInterface Parent { get; set; } 
    public string Name { get; set; } 

    public string CProperty { get; set; } 
} 

例外是:

「無法序列構件 TestXMLSerializer.ClassA.Parent 類型TestXMLSerializer.IMyInterface 的,因爲它是一個接口」。

+0

不會出現工作。我也嘗試使用XmlInclude屬性,但沒有運氣 – Jeremy 2009-11-25 20:15:46

1

有趣的是:當你用一個抽象類替換接口聲明的時候,它就起作用了。 ..甚至有列表。

(嗯,實際上這是不好笑......)

public class Root 
{ 
    [XmlElementAttribute("ClassA", typeof(ClassA))] 
    [XmlElementAttribute("ClassB", typeof(ClassB))] 
    [XmlElementAttribute("ClassC", typeof(ClassC))] 
    public List<IMyInterface> Items { get; set; } 
} 


public abstract class IMyInterface 
{ 
    IMyInterface Parent { get; set; } 
    string Name { get; set; } 
} 
+0

這很好用!謝謝! :) – 2011-12-20 02:53:10

相關問題