2011-12-21 88 views
2

我被困在這一點,還沒有找到一個實際的答案。 也許我只是沒有搜索正確的條款,對我來說是裸露的。通過WCF服務傳遞指定的泛型類型

具有以下類:

[DataContract] 
[KnownType(typeof(SpecifiedItemCollection))] 
public class ItemCollection<T> : IEnumerable where T : BaseItem 
{ 
    private Dictionary<int, T> items = null; 

    //Some NON-Generic Methods and Properties 

    //Some methods like this: 
    public T DoBla(int _1, bool _2) { ... } 
} 

[DataContract] 
public class SpecifiedItemCollection : ItemCollection<SpecifiedItem> 
{ 
    //... 
} 

[DataContract] 
[KnownType(typeof(SpecifiedItem))] 
public class BaseItem { ... } 

[DataContract] 
public class SpecifiedItem : BaseItem { ... } 

我如何通過WCF服務提供SpecifiedItemCollection?

我的界面看起來是這樣,但不幸的是它不會工作

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    public SpecifiedItemCollection GetCol(int _1, bool _2); 
} 

而對於其他信息:

是的,我看到你不能通過一般的通過WCF(例如ItemCollection直接),但我發現有幾個消息來源表示你可以通過它們,如果你指定了Generic本身。

那麼,我做錯了什麼? :)

在此先感謝。

編輯:

@ rally25rs: 的問題是,它只是關閉連接。我能夠在我的項目中引用該服務,並相應地生成所需的類/文件。 我可以實例化一個服務名* 客戶 *,但只要我打電話從我服務的方法,這將返回一個SpecifiedItemCollection,它關閉連接。

但無論如何,我現在解決了這個問題。 查看我自己的答案。

+2

你是什麼意思的「它不會工作」?你有構建錯誤嗎?運行時錯誤?沒有錯誤,但WCF只發送空值? – CodingWithSpike 2011-12-21 14:11:30

+1

如果您希望將它傳遞給客戶端,那麼您的ItemCollection中的items成員變量需要[DataMember]屬性。除此之外,我認爲這應該起作用 - 你會得到什麼錯誤?你的綁定配置是什麼?也許從您的服務配置文件發佈您的system.serviceModel部分? – kmp 2011-12-21 15:39:25

回答

0

好像我找到了一個臨時的解決方案,雖然我不很喜歡。

在我上面的例子,改變SpecifiedItemCollection級如下:

[DataContract] 
public class SpecifiedItemCollection 
{ 
    public ItemCollection<SpecifiedItem> Base; 

    public SpecifiedItemCollection() 
    { 
     Base = new ItemCollection<SpecifiedItem>(); 
    } 

    //... 
} 

有了這個,我可以調用同一類型ItemCollection和功能有我SpecifiedItemCollection級與額外的方法和屬性。

如果任何人有另一種解決辦法,我會很樂意看到它。 :)