BusManager
एक जेनेरिक है, जिस प्रकार आप Of <type>
में पास करते हैं, संकलन समय पर निर्दिष्ट होना चाहिए। यह पारंपरिक पैरामीटर की तरह नहीं है जिसे आप रनटाइम पर बदल सकते हैं।
यह आपके द्वारा सूचीबद्ध कोड से अस्पष्ट है BusManager
वास्तव में करता है। यदि यह सब कुछ कर रहा है जेनेरिक प्रकार का एक उदाहरण बना रहा है, तो हो सकता है कि जिस व्यक्ति ने इसे बनाया है वह वास्तव में जेनेरिक समझ में नहीं आता है। क्या आपके पास BusManager
काम करने के लिए पुन: कार्य करने की क्षमता है, या आप इसका उपयोग करने के लिए सीमित हैं?
जैसा कि @jmoreno ने उल्लेख किया है, आप प्रकार के नाम को शामिल करने वाली स्ट्रिंग से किसी प्रकार का उदाहरण बनाने के लिए प्रतिबिंब का उपयोग कर सकते हैं। यहाँ है कि कैसे काम करेगा:
Imports System.Reflection
Imports System.IO
Public Class ObjectFactory
Private Shared Function CreateObjectFromAssembly(ByVal assembly As Assembly, ByVal typeName As String) As Object
' resolve the type
Dim targetType As Type = assembly.GetType(typeName)
If targetType Is Nothing Then
Throw New ArgumentException("Can't load type " + typeName)
End If
' get the default constructor and instantiate
Dim types(-1) As Type
Dim info As ConstructorInfo = targetType.GetConstructor(types)
Dim targetObject As Object = info.Invoke(Nothing)
If targetObject Is Nothing Then
Throw New ArgumentException("Can't instantiate type " + typeName)
End If
Return targetObject
End Function
Public Shared Function CreateObject(ByVal typeName As String) As Object
Return CreateObjectFromAssembly(Assembly.GetExecutingAssembly, typeName)
End Function
Public Shared Function CreateObject(ByVal typeName As String, ByVal assemblyFileName As String) As Object
Dim assemblyFileInfo = New FileInfo(assemblyFileName)
If assemblyFileInfo.Exists Then
Return CreateObjectFromAssembly(Reflection.Assembly.LoadFrom(assemblyFileName), typeName)
Else
Throw New ArgumentException(assemblyFileName + " cannot be found.")
End If
End Function
End Class
एक उत्पादन ऐप्लिकेशन में, मैं शायद अपने आधार वर्ग या इंटरफ़ेस करने के लिए इन तरीकों में से सभी के लिए वापसी प्रकार सेट करेंगे। बस सुनिश्चित करें कि आप नामस्थान सहित पूर्ण typeName
में गुजरते हैं।
जगह में है कि कारखाने वर्ग के साथ
, तो अपने कोड के सुरुचिपूर्ण संस्करण कुछ इस तरह दिखेगा:
Dim myItem as DTO.MyBaseClass = ObjectFactory.CreateObject("DTO." & GetTypeString())
वाह अच्छा लग रहा है, धन्यवाद एक गुच्छा! –