2010-03-19 22 views
1

我不知道如何描述這個,但我想創建一個基類,其中包含一個名爲FromXml的共享(工廠)函數。我想這個函數實例化一個對象在正確類型,然後通過一個XmlDocument填充如何創建通用構造函數? (即BaseClass.FromXml(<param>)

例如,假設我有這樣的事情:

Public Class XmlObject 
    Public Shared Function FromXml(ByVal source as XmlDocument) As XmlObject 
     // <need code to create SPECIFIC TYPE of object and return it 
    End Function 
End Class 

Public Class CustomObject 
    Inherits XmlObject 
End Class 

我希望能夠做這樣的事情:

Dim myObject As CustomObject = CustomObject.FromXml(source) 

這可能嗎?

回答

0

如果你想告訴一個函數做某些特定類型的事情,只需在其中添加通用參數。不知道這是不是最好的方式去實現你的原意,但它會完成工作。

Public Class XmlObject 
     Public Shared Function FromXml(Of T)(ByVal source As XmlDocument) As T 
     Dim result As T = Activator.CreateInstance(GetType(T)) 

     Return result 
     End Function 
    End Class 
1

首先,FromXml函數必須知道它需要創建和返回的對象的類型。 要做到這一點,你既可以:

傳遞該類型本身作爲一個參數:

Public Shared Function FromXml(ByVal source As XmlDocument, _ 
           ByVal resultType As Type) As XmlObject 
End Function 

使用泛型:

Public Shared Function FromXml(Of T)(ByVal source As XmlDocument) As XmlObject 

End Function 

(使用泛型,你還可以指定,例如,「作爲XmlObject的T」,僅在T中接收可分配給XmlObject的類)。

接下來,您將必須決定如何實例化傳入類型的新對象。 您可以調查傳遞的確切類型並相應地創建一個新實例(硬編碼),或使用Reflection來調用傳入類型的構造方法(假設它具有可訪問的構造函數)(請參閱example here)。這可能會有點棘手,因爲如果T沒有空的構造函數,那麼你必須調查構造函數的參數並調用matchin委託(再次使用Reflection)。

+0

不錯。我其實不知道你可以限制泛型參數到一個特定的類。那會爲我節省很多「如果TryCast ...」的代碼。 – hometoast

+0

它運行良好,你可以限制到接口,並作出通用的限制(ClassTableClass(的TBase)...函數myFunc(的TBase)等等等等 我不知道任何關於Activator.CreateInstance ,我會檢查出來的:-) –