我正在从更大的DataField
中解析Message
。 Message
的格式为 RecordHeader | DataFieldKey | DataField | DataFieldKey | DataField | DataFieldKey | DataField | DataFieldKey | DataField (没有分隔符,只有效果。){{1 block定义了后面的DataFieldKey
的长度和类型。我有一个DataField类,用于继承各种DataField派生类型的基本功能
在我解析DataFieldKey之后,我知道我需要创建的类型以及要将消息复制到DataField中的byte []块。
DataField
这会导致如下错误 无法将类型'Namespace.TripType'隐式转换为'Namespace.GPSData'
我可以看到名称是在第一种情况下定义的,所有以下内容都失败了。我不知道该怎么做。我希望能够为DataField创建正确的类型,继续调用其中的一个或两个方法,然后为下一个字段冲洗重复。我可以使用一些继承技巧吗?我是否需要将每个var dataField0命名为dataFieldX?
switch(fieldId)
{
case (0):
GPSData dataField = new GPSData(dataFieldContent);
break;
case (1):
DebugEvent dataField = new DebugEvent(dataFieldContent);
break;
case (2):
DigitalData dataField = new DigitalData(dataFieldContent);
break;
case (3):
Driver dataField = new Driver(dataFieldContent);
break;
//case etc
default:
Debug.WriteLine("Message {0}. Location {1} Unable to process unknown data field type ({2})", recordHeader.SequenceNumber, dfk.FieldPosition, fieldId);
break;
}
是用于检查switch(fieldType)
尝试了以下操作,但它只有更多错误。我已将DataField.FieldId
重命名为DataField
,因为我还有两个接口DataFieldBase
和IDataFieldBase
,以确保我在所有地方实施。
IDataFieldImpl
DataFieldBase dataField = null;
switch(fieldId)
{
case (0):
dataField = new GPSData();
dataField.Content = dataFieldContent;
(dataField as GPSData).TestArray = dataFieldContent;
break;
//etc
宣称它是答案 0 :(得分:0)
据我所知,这不会以你设置的方式工作,因为即使switch语句的第二,第三等条件中的对象只在运行时创建,编译器仍然会看到它们是第一个条件在编译时创建它们的类型。
如果所有dataField类型都从公共祖先继承,则将其用作每个切换条件的dataField类型,或者甚至在切换之前将其声明为值为null的祖先类型,然后在切换条件期间分配各种值
如果它们不是从共同的祖先继承,那么看看你是否不能以这种方式设计祖先类中的通用数据和功能,甚至使用接口。
编辑:
或者在切换之前将dataField声明为具有空值的类型对象?
尝试的代码:
class CommonData
{
public string CommonStuff { get; set; }
}
class GPSData : CommonData
{
public string GPSStuff { get; set; }
}
class DigitalData : CommonData
{
public string DigitalStuff { get; set; }
}
class DriverData : CommonData
{
public string DriverStuff { get; set; }
}
public static class FieldStuff
{
public static void TryStuff(int aFieldId)
{
CommonData dataField = null;
switch (aFieldId)
{
case (0):
dataField = new GPSData();
dataField.CommonStuff = "abcd";
(dataField as GPSData).GPSStuff = "bcde";
break;
case (1):
dataField = new DigitalData();
dataField.CommonStuff = "abcd";
(dataField as DigitalData).DigitalStuff = "cdef";
break;
case (2):
dataField = new DriverData();
dataField.CommonStuff = "abcd";
(dataField as DriverData).DriverStuff = "defg";
break;
default:
break;
}
}
}