我正在使用 C# 中的 API 和一些类,如下所示。有两个消息类MessageA和MessageB多个字段类等FieldA。FieldB字段类都属于一个基类Field。
消息将包含可以通过以下方式访问的各种字段
msgA.getField(FieldX field)
(将FieldX条目(如果存在)从msgA复制到field)并且
msgB.set(FieldX field)。
还有
msgA.isSetField(FieldX field)
确保消息包含类型为 的字段FieldX。
我需要编写一个方法来获取 aMessageA并将某些字段复制到 a MessageB。我现在有一个工作函数,但它有一大堆语句,例如
FieldX fieldX = new FieldX();
if(msgA.isSetField(fieldX))
{
msgA.getField(fieldX);
msgB.set(fieldX);
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很愚蠢,所以我想编写一个单独的方法来做到这一点。不过,我对 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这行不通。在内部条件语句中, 的类型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 { ... }
}
Run Code Online (Sandbox Code Playgroud)
那么你的方法就可以真正通用:
private void SetMessageB<T>(Message msgA, Message msgB, T field) where T : Field
{
if (msgA.isSetField(field))
{
msgA.getField(field);
msgB.set(field);
}
}
Run Code Online (Sandbox Code Playgroud)