在C#中基于变量创建变量类型

时间:2016-12-12 03:04:59

标签: c# inheritance switch-statement

我正在从更大的DataField中解析MessageMessage的格式为 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,因为我还有两个接口DataFieldBaseIDataFieldBase,以确保我在所有地方实施。

IDataFieldImpl
  • 在声明之前不能使用局部变量'dataField'
    • 在所有数据字段中使用(3次)
    • 我以为DataFieldBase dataField = null; switch(fieldId) { case (0): dataField = new GPSData(); dataField.Content = dataFieldContent; (dataField as GPSData).TestArray = dataFieldContent; break; //etc 宣称它是
  • 'Ctrack.DMT.Message.GPSData'不包含带0参数的构造函数
    • 我实际上没有没有参数的构造函数
    • 我做了一个后,这个错误就消失了

1 个答案:

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