带有条件语句的c#泛型类型参数

本文关键字:泛型类型参数 语句 有条件 | 更新日期: 2023-09-27 18:03:51

我正在使用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文章或教程或诸如此类的内容。谢谢你的帮助。

带有条件语句的c#泛型类型参数

如果消息对象的方法也是泛型的,那么在这里使用泛型才有意义:

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