2014-04-08 136 views
1

這看起來像一個可能經常出現的模式,所以我想也許有人知道如何做到這一點。假設我有三類:訪問動態創建的子類的屬性(強類型)

class Class1 { 
    string A { get; set; } 
} 
class Class2 : Class1 { 
    string B { get; set; } 
} 
class Class3 : Class1 { 
    string C { get; set; } 
} 

和一個字符串:x = "Namespace.Class2";

的目標是,庫代碼實例,通過x給出的類型這是考慮到客戶端的一個實例。然後,客戶機訪問的Class2的強類型的屬性,就像這樣:

Class2 test = CreateTheObject(); 
test.B = "bad wolf"; 
test.A = "super"; 

你說得對,我們可以反映屬性,但不是強了類型。用戶可以執行GetProperty(Class2,「SomePropertyThatDoesntExist」)。它最終可能會拋出運行時異常,但這是一種糟糕的用戶體驗。這是我現在正在編寫的解決方案,因爲我無法弄清楚如何去做我想做的事情。

無論如何,在這個問題上:任何想法如何做到這一點?

+1

'因爲我搞不清楚我想做什麼.'你應該先弄清楚你想要什麼 – Thewads

+1

你能給一個具體的例子說明你正在試圖完成什麼嗎?您提出問題的方式似乎非常模糊。 「Class2.B =」壞狼「是什麼?他們是靜態屬性?爲了使客戶端代碼以強類型方式訪問對象的屬性,必須將該對象轉換爲具有該屬性的類型。另一種方法是將對象強制轉換爲動態,但不會再強制類型化。 – JLRishe

+1

我不認爲有什麼辦法可以讓你創建的對象的類型靜態地知道你正在做的事情......因此,沒有辦法靜態地知道方法/屬性是否存在該對象實例化。你不能使用泛型'實例化()'或什麼?即使這似乎相當愚蠢。你爲什麼需要這樣做?除非你有充分的理由,否則你可能會做錯* * –

回答

1

如果相關類型在編譯類型中未知,則不能強類型化。如果您在編譯時知道類型,則可以將其分配或轉換爲該類型。

您可以使用dynamic關鍵字來做你想做的事。但是,由於該類型在編譯時不爲人知,因此如果使用其他類型沒有問題的屬性,就會冒運行時錯誤。