带有条件语句的c#泛型类型参数
本文关键字:泛型类型参数 语句 有条件 | 更新日期: 2023-09-27 18:03:51
我正在使用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文章或教程或诸如此类的内容。谢谢你的帮助。
如果消息对象的方法也是泛型的,那么在这里使用泛型才有意义:
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);
}
}