我與API工作在C#中的一些類別如下。有兩種消息類MessageA
和MessageB
和數字字段的類FieldA
,FieldB
等的領域類都屬於一個基類Field
。C#泛型類型參數與條件語句
甲消息將包含能夠作爲
msgA.getField(FieldX field)
訪問各種領域(複製FieldX
條目(如果存在的話)從msgA
到field
)和
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。謝謝你的幫助。
您是否嘗試過使用'T字段'在你的方法簽名而不是'Field field'?減少對演員的需求。 – drharris
好點,它確實簡化了它,但問題仍然存在。謝謝。 –