2010-01-04 9 views
1

text: J'ai une classe de base avec une méthode pour synchroniser les données. Cependant, je dois être capable de créer un nouvel objet dans le processus qui est le même que l'objet parent qui a hérité de la classe de base.Comment définir un objet comme le type d'un autre objet?

Je veux faire quelque chose comme ceci:

Sub Transfer(ByVal OBType As BaseClass) 
    Dim A as new typeof(OBType) 
    A.doSomething() 
End Sub 

EDIT

J'appologize pour toute confusion

Mon cas d'utilisation est que je transférer des données entre deux objets et la méthode est responsable de la fusion des changements entre eux. Lorsque la méthode est appelée, elle reçoit un ensemble d'enregistrements et doit ensuite appeler une méthode de transfert qui les synchronise. Lors de l'exécution de GetDataRow, j'ai besoin d'une nouvelle version de l'objet et j'ai également besoin d'une nouvelle version pour terminer le transfert.

Voici une version allégée du code:

GetDataRow crée l'objet forment les données DataRow et transfert compare ensuite et apporte les modifications nécessaires.

Sub Transfer(ByVal OBType As BaseBLLClass) 
     'Get a list from each side and synch 
     Dim DT As DataTable = GetDataMethod() ‘Gets data to transfer 
     Dim A As OBType 
     Dim B As OBType 
     For Each Row As DataRow In DT.Rows 
      A = New OBType 
      B = New OBType 
      GetDataRow(A, Row).TransferData(B) 
     Next 
    End Sub 

Solution

Public Shared Sub Base_Transfer(Of OBType As BaseBLLClass)() 
     'Get a list from each side and synch 
     Dim DT As DataTable = GetDataMethod() ‘Gets data to transfer 
     Dim A As BaseClassUIM = Activator.CreateInstance(GetType(OBType)) 
     Dim B As BaseClassUIM = Activator.CreateInstance(GetType(OBType)) 
     For Each Row As DataRow In DT.Rows 
      A = Activator.CreateInstance(GetType(OBType)) 
      B = Activator.CreateInstance(GetType(OBType)) 
      GetDataRow(A, Row).TransferData(B) 
     Next 
    End Sub 
+2

Votre conception ... il y a quelque chose qui ne va pas. – Will

+0

Oui, c'est pourquoi j'ai posé la question. Le nouveau typeof (OBType) n'est pas un code valide. C'est donner un exemple de ce que je veux faire, pas nécessairement comment le faire. – Middletone

+1

Si vous avez posé la question de l'autre côté, comme "Je dois faire ABC et la seule façon dont je peux penser à le faire est ZXY Y a-t-il un meilleur moyen?" vous obtiendriez de meilleures réponses. – Will

Répondre

1

Vous pouvez utiliser Activator.CreateInstance pour construire le nouvel objet avec le type approprié. Une fois que vous avez fait cela, vous pouvez le lancer dans votre classe de base.

+0

Est-ce ce dont il a besoin? Semble un peu ... inutile dans la façon dont il demande de le faire. – Will

+1

Dans v1 de cette question, cela a directement répondu à ce qu'il demandait. Il n'y avait pas de véritable explication de ce qui était tenté, juste comment faire cela. Cependant, cela est parfois utile - mais nécessite généralement d'utiliser la réflexion pour copier d'autres valeurs, aussi, pour être vraiment utile ... –

+0

Bonne observation Reed. J'utilise la réflexion lors de la synchronisation des données en fonction des propriétés des objets, mais qui est encapsulée dans la méthode qui fait la synchronisation qui doit encore être passé des objets valides à comparer. Votre réponse était ce dont j'avais besoin. – Middletone

1

Je ne suis pas au courant de la façon dont il regarderait en VB, mais en C# vous pourriez faire avec les génériques comme celui-ci:

public void Transfer<T>(T item) where T: BaseClass, new() 
{ 
    var a = new T(); 
    a.DoSomething(); 
} 

Voici ma faible tentative d'écrire la même chose dans VB:

Sub Transfer(Of T As {BaseClass, New})(ByVal OBType As T) 
    Dim A as new T 
    A.doSomething() 
End Sub 
+0

Cela ne fait probablement pas ce que vous pensez qu'il fait. T est résolu à la compilation, pas à l'exécution. – recursive

+0

Oui, j'en suis conscient. Ce n'est pas clair pour moi si c'est ce qu'on me demande ou non ... –

+0

Bonne réponse. J'ai dû combiner votre code avec Reeds pour obtenir la solution mais cela fonctionne. Je posterai le code. – Middletone

Questions connexes