具有条件语句的C#通用类型参数

时间:2011-07-29 15:41:29

标签: c# .net generics

我正在使用C#中的API和一些类,如下所示。有两个邮件类MessageAMessageB以及许多字段类FieldAFieldB等。字段类都属于基类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文章或教程或诸如此类的东西。谢谢你的帮助。

1 个答案:

答案 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);
    }
}