2011-08-27 70 views
1

由於我前幾天(可以檢查這個帖子here)最近的一個問題,我需要創建一種方式,我的一些LINQ到SQL表可以被動態引用。我設法通過一個抽象的LogTable類來實現,它包含我的DataTable中定義的所有LogTable屬性。我能夠做到這一抽象的方式,因爲我的LogTable具有相同的結構,因此具有相同的屬性。C#子類丟失屬性值

繼承人的還原後的代碼:

抽象基類

public abstract class LogTableStructure 
{ 
     public int ID { get; set; } 

     public datetime? LastAccess { get; set; } 

     public string Username { get; set; } 
} 

我(還原後)的動態更新LogTable方法:

public void UpdateLog<T>(T currentLOG) where T : LogTableStructure 
    { 

     LogTableStructure logStructure = null; 

     //LogTableEnum is defined on this class constructor 
     switch (LogTableEnum) 
     { 
      case LogTableEnum.Log2009: 
       logStructure = this.factory.LogDB.LOG_2009s 
        .SingleOrDefault(q => q.ID == currentLOG.ID); 
       break; 
      case LogTableEnum.Log2010: 
       logStructure = this.factory.LogDB.LOG_2010s 
        .SingleOrDefault(q => q.ID == currentLOG.ID); 
       break; 
      case LogTableEnum.Log2011: 
       logStructure = this.factory.LogDB.LOG_2011s 
        .SingleOrDefault(q => q.ID == currentLOG.ID); 
       break; 
    } 
} 

問題

由於某些原因,currentLOG參數會引發運行時空引用異常,即使它具有填充的所有LogTable屬性。我注意到,通過使用vs2010 debbuger,當currentLOG屬性被填充時,基類(LogTableStructure)屬性都是空的,就好像基類對象爲null。

我是否僞造了關於成員隱藏繼承或類似的東西?我甚至在我的.dbml的所有LogTable屬性中添加了new修飾符,但即使這樣也沒有解決問題

+0

你可以舉一個你調用'UpdateLog'方法的代碼的例子嗎?另外,你在哪裏定義你注入的'ocorrenciaBanco'對象? –

+1

什麼是'ocorrenciaBanco'?你爲什麼要聲明一個你不理會的logStructure變量? 「currentLOG參數拋出[...]」是什麼意思? (參數本身不能拋出異常 - 只能訪問。) –

+0

您是否知道上一個case語句中的拼寫錯誤?應該是Log2011,我猜... – VVS

回答

1

只是讓你注入實際實例成對象:應該這樣做

// This object is going to have to be a class that inherits from your abstract class 
// It can't be a null object of the type of your abstract class. 
var logStructure = new InstanceOfLogTableStructure(); 
logStructure.InjectFrom(currentLOG); 

+0

LogTableStructure是一個抽象類,我不能實例化它。 – AdrianoRR

+0

對不起,您將需要實例化* some *類。您不能注入抽象類的空實例。 –

+0

我已將我的抽象類轉換爲公共類,以便我可以注入它。猜猜出於什麼原因,即使所有LogTables屬性都爲空,我可以更新我的值。我不喜歡使用代碼的想法,我不明白它的行爲,所以我會繼續尋找更好的解決方案。不管怎麼說,還是要謝謝你。 – AdrianoRR

0

您似乎錯誤地訂購了您的產品。你爲logStructure分配null,然後你調用InjectFrom。只有這樣你才能將一個工廠創建的實例分配給該變量。