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 🙂

InformationsquelleAutor Rick Flow | 2011-02-09
Schreibe einen Kommentar