2011-07-29 81 views
4

我與API工作在C#中的一些類別如下。有兩種消息類MessageAMessageB和數字字段的類FieldAFieldB等的領域類都屬於一個基類FieldC#泛型類型參數與條件語句

甲消息將包含能夠作爲

msgA.getField(FieldX field)

訪問各種領域(複製FieldX條目(如果存在的話)從msgAfield)和

msgB.set(FieldX field)

還有

msgA.isSetField(FieldX field)

,以確保郵件包含FieldX類型的字段。

我需要編寫採取MessageA並複製了某些領域的MessageB的方法。我現在有一個工作的功能,但它有一個像

FieldX fieldX = new FieldX(); 
if(msgA.isSetField(fieldX)) 
{ 
    msgA.getField(fieldX); 
    msgB.set(fieldX); 
} 

這似乎是愚蠢的,我一大堆報表,所以我想編寫一個單獨的方法來做到這一點。雖然我是C#和泛型類型的新手,但我不太確定最好的方式。在嘗試了一些東西之後,我寫了

private void SetMessageB<T>(MessageA msgA, MessageB msgB, Field field) where T : Field 
{ 
    var field_t = field as T; 
    if (field_t != null) 
    { 
     if (msgA.isSetField(field_t)) 
     { 
      msgA.getField(field_t); 
      msgB.set(field_t); 
     } 
    } 
} 

但是這不起作用。在內部條件語句中,field_t類型被轉換爲int。這有點有道理爲什麼會發生這種情況(即,這些功能不能採取任何類型作爲參數,所以編譯器不能肯定它會工作每次)。但是我想知道是否有人能指出解決問題的好方法。隨意將我鏈接到MSDN文章或教程或whatnot。謝謝你的幫助。

+0

您是否嘗試過使用'T字段'在你的方法簽名而不是'Field field'?減少對演員的需求。 – drharris

+0

好點,它確實簡化了它,但問題仍然存在。謝謝。 –

回答

3

它只會意義在這裏使用仿製藥,如果你的消息對象的方法是通用性,以及:

class Message 
{ 
    bool isSetField<TField>(TField field) where TField : Field { ... } 
    void getField<TField>(TField field) where TField : Field { ... } 
    void set<TField>(TField field) where TField : Field { ... } 
} 

然後你的方法,才能真正通用:

private void SetMessageB<T>(Message msgA, Message msgB, T field) where T : Field 
{ 
    if (msgA.isSetField(field)) 
    { 
     msgA.getField(field); 
     msgB.set(field); 
    } 
} 
+0

啊,這是有道理的。你有什麼想法可以做到這一點?我也想過做一個列表,加入一些新的'FieldX'的它,但我也有類似的問題。 –

+0

你必須提供更多關於你想要完成的細節。有了混合字段類型的列表,您仍然必須求助於投射。 –

+0

我只想清理一下我的方法。現在我有大約20個這樣的陳述,所以我想可能會有一些辦法讓它不那麼重複。但每次我嘗試一些東西(例如傳遞給不同的方法或使用混合類型列表)時,我都會遇到麻煩,因爲這些字段都是不同的類型。我假設有一種構造可以讓我只寫這個設置一次,我只是不知道它是什麼。 –