我正在使用C#中的API和一些类,如下所示。有两个邮件类MessageA
和MessageB
以及许多字段类FieldA
,FieldB
等。字段类都属于基类Field
消息将包含可以作为
访问的各种字段 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文章或教程或诸如此类的东西。谢谢你的帮助。
答案 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);
}
}