VB.NET CType: Wie verwende ich CType zu ändern, eine object-variable "obj" meine benutzerdefinierte Klasse, die ich Verweis mit einem string-variable wie obj.GetType.Name?
Den code unten funktioniert für die Klasse, die ich hart codiert "XCCustomers" in meinem RetrieveIDandName Methode wo ich CType. Allerdings möchte ich weitergeben kann, die in verschiedenen Klassen und property-Namen, um die integer-und string-LISTE zurück. Zum Beispiel in meinem code würde ich gerne auch in "XCEmployees" zu meiner RetrieveIDandName Methode. Ich fühle mich so nah... ich hatte gehofft, dass jemand wusste, wie man CType, wo ich kann, pass in den Namen der Klasse als string-variable.
Hinweis, alle anderen Beispiele, die ich gesehen habe und versucht, scheitern, weil wir sind mit " Option Strict On verbietet die späte Bindung. Das ist, warum ich brauche, um zu verwenden CType.
Ich studierte auch den "Activator.CreateInstance" code-Beispiele, um zu versuchen, um die Klasse Referenz der Instanz von string name, aber ich war nicht in der Lage zu bekommen CType zu arbeiten.
Wenn ich obj.GetType.Name oder obj.GetType.FullName an die Stelle der "XCCustomers" in CType(obj, XCCustomers)(i)
Ich bekomme die Fehlermeldung "Typ" obj.GetType.Name' ist nicht definiert" oder "Typ" obj.GetType.FullName' ist nicht definiert"
Vielen Dank für Ihre Hilfe.
Rick
'+++++++++++++++++++++++++++++++
Imports DataLaasXC.Business
Imports DataLaasXC.Utilities
Public Class ucCustomerList
'Here is the calling method:
Public Sub CallingSub()
Dim customerList As New XCCustomers()
Dim customerIdAndName As New List(Of XCCustomer) = RetrieveIDandName(customerList, "CustomerId", " CustomerName")
'This code below fails because I had to hard code “XCCustomer” in the “Dim item...” section of my RetrieveEmployeesIDandName method.
Dim employeeList As New XCEmployees()
Dim employeeIdAndName As New List(Of XCEmployee) = RetrieveIDandName(employeeList, "EmployeeId", " EmployeeName")
'doing stuff here...
End Sub
'Here is the method where I would like to use the class name string when I use CType:
Private Function RetrieveIDandName(ByVal obj As Object, ByVal idPropName As String, ByVal namePropName As String) As List(Of IntStringPair)
Dim selectedItems As List(Of IntStringPair) = New List(Of IntStringPair)
Dim fullyQualifiedClassName As String = obj.GetType.FullName
Dim count As Integer = CInt(obj.GetType().GetProperty("Count").GetValue(obj, Nothing))
If (count > 0) Then
For i As Integer = 0 To count - 1
'Rather than hard coding “XCCustomer” below, I want to use something like “obj.GetType.Name”???
Dim Item As IntStringPair = New IntStringPair(CInt(CType(obj, XCCustomers)(i).GetType().GetProperty("CustomerId").GetValue(CType(obj, XCCustomers)(i), Nothing)), _
CStr(CType(obj, XCCustomers)(i).GetType().GetProperty("CustomerName").GetValue(CType(obj, XCCustomers)(i), Nothing)))
selectedItems.Add(Item)
Next
End If
Return selectedItems
End Function
End Class
'+++++++++++++++++++++++++++++++
' Unten sind die unterstützenden Klassen, wenn Sie brauchen, um zu sehen, was sonst noch passierte:
Namespace DataLaasXC.Utilities
Public Class IntStringPair
Public Sub New(ByVal _Key As Integer, ByVal _Value As String)
Value = _Value
Key = _Key
End Sub
Public Property Value As String
Public Property Key As Integer
End Class
End Namespace
'+++++++++++++++++++++++++++++++
Namespace DataLaasXC.Business
Public Class XCCustomer
Public Property CustomerId As Integer
Public Property CustomerName As String
End Class
End Namespace
'+++++++++++++++++++++++++++++++
Namespace DataLaasXC.Business
Public Class XCCustomers
Inherits List(Of XCCustomer)
Public Sub New()
PopulateCustomersFromDatabase()
End Sub
Public Sub New(ByVal GetEmpty As Boolean)
End Sub
End Class
End Namespace
'+++++++++++++++++++++++++++++++
Namespace DataLaasXC.Business
Public Class XCEmployee
Public Property EmployeeId As Integer
Public Property EmployeeName As String
End Class
End Namespace
'+++++++++++++++++++++++++++++++
Namespace DataLaasXC.Business
Public Class XCEmployees
Inherits List(Of XCEmployee)
Public Sub New()
PopulateEmployeesFromDatabase()
End Sub
Public Sub New(ByVal GetEmpty As Boolean)
End Sub
End Class
End Namespace
- Sorry, aber du hast geschrieben, viel zu viel code. Kochen Sie diese nach unten, bis Sie ein paar Zeilen funktionierenden code - hoffentlich nicht mehr als 10 - das zeigt die Fehlermeldung, dass. Ps. Durch funktionierenden code, offensichtlich meinen wir code, der funktionieren würde, wenn Sie nicht mit diesem problem. Danke.
- Mit
Option Strict On
ist eine Wahl. Ich würde sagen, dass standardmäßig sollte es immer sein, aber es können Gründe dafür sein, warum Ausnahmen gemacht werden muß, und es muss abgeschaltet werden. Für mich ist es in der Regel schon, wenn ich tun müssen, um die Office-Automatisierung verwenden Sie Späten Bindung. Also, wenn Sie denken, dass Sie einen gültigen Grund, warum ich würde vorschlagen, erwägen, Sie auszuschalten für die Datei(en), wo dieser code würde, vorzugsweise mit einem Kommentar zu erklären, warum es deaktiviert wurde. - Ich glaube, dass er der Begegnung mit diesem Thema, weil er hat nicht gefragt, die einfachere Frage - "wie Schreibe ich diese Funktion, so dass es kann akzeptieren ein
List(Of T)
für einen beliebigen Typ T?" - Auch in diesem Fall ist es vielleicht nicht Gültiger Grund für das ausschalten in diesem Fall (habe ich nicht gelesen über die ganze Frage im detail).
- Vielen Dank skaffman für Ihre Hilfe dabei zu 🙂
- Ich danke Ihnen sehr Binäre Worrier und ho1, für Ihre Hilfe dabei zu 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit List(Of T) implementiert die nicht-generische IList-Schnittstelle, die Sie ändern könnten Ihre Funktion Erklärung:
Werden und dann die Linie lästig werden würde (auch mithilfe der Eigenschaft name, Parameter):
Natürlich könnte man noch den ersten parameter durch das Objekt, und versuchen Sie dann zu werfen, um IList, aber das ist bis zu Ihnen.
System.Collections.IList
. Standardmäßig in modernen VB.Net die non-generic System.Collections-namespace ist nicht sichtbar.CType(obj,System.Collections.IList)
arbeiten. Der rest Ihres Codes hängt nicht von den tatsächlichen Typ der Objekte innerhalb der Liste, so dass Sie nicht brauchen eine spezifische Art.Vom MSDN
Dies ist im Grunde sagen Sie nicht verwenden können, CType, dynamisch, einfach, statisch. d.h. An der Stelle, wo der code kompiliert wird, muss der compiler wissen, was
typename
wird.Können Sie nicht ändern, diese zur Laufzeit.
Hoffe, das hilft.
ctype wird verwendet, um zu konvertieren in Objekt-Typ.