2016-12-12 117 views
1

變量類型我解析DataField的出較大Message。該Message的格式爲RecordHeader | DataFieldKey |數據字段| DataFieldKey |數據字段| DataFieldKey |數據字段| DataFieldKey |數據字段(沒有分隔符,就在那裏對效應)的DataFieldKey塊定義下面的DataField的長度和類型。我有一個DataField類用於繼承各種DataField派生類型的基本功能創建基於變量在C#

解析我的DataFieldKey後,我知道我需要創建的類型,並將字節[]的塊從消息複製到數據字段。

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

這導致了這樣的錯誤以下 無法隱式轉換類型「Namespace.TripType」到「Namespace.GPSData」

我可以看到名稱在第一種情況下定義,所有以下失敗。我不知道這裏要做什麼。我希望能夠爲DataField創建正確的類型,繼續調用其中的一個或兩個方法,然後重複沖洗下一個字段。我可以使用一些繼承技巧嗎?我是否需要將每個var dataField0命名爲dataFieldX?

switch(fieldType)是檢查DataField.FieldId

曾嘗試以下懶硬編碼,但它只是有更多的錯誤。我已經改名爲DataFieldDataFieldBase因爲我也有兩個接口IDataFieldBaseIDataFieldImpl,以確保我實現的事情隨處可見。

DataFieldBase dataField = null; 

switch(fieldId) 
{ 
    case (0): 
     dataField = new GPSData(); 
     dataField.Content = dataFieldContent; 
     (dataField as GPSData).TestArray = dataFieldContent; 
     break; 
//etc 
  • 無法使用局部變量 '的dataField' 之前它宣佈
    • 發生到處使用的dataField WS(3次)
    • 我想DataFieldBase dataField = null;宣佈它
  • 「Ctrack .DMT.Message.GPSData'不包含具有0個參數的構造函數
    • 我實際上沒有一個無參數的構造
    • 我做了一個後此錯誤走
+0

也許你可以使用'dynamic'這種情況 – Zen

+1

你真的應該提供一個[MCVE。 – Enigmativity

回答

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; 
     } 
    } 
} 
+0

你不能從'BaseType'投射到'DerivedType' :(最近似乎是'DerivedType(BaseType b)'的構造函數,它可以將正確的屬性複製到其中。一個大的if else。也許 – Hecatonchires

+0

你可以試試編輯中的代碼嗎? – codemonkey65

+0

不幸的是沒有什麼好的,我將在上面編輯文檔 – Hecatonchires