2009-06-10 6 views
1

Je passe de VB à C#. J'essaie de parcourir une classe de collection qui est une collection de classes de données mais je n'arrive pas à extraire les valeurs réelles des propriétés de classe de données (trouvez le code correct pour le faire). J'ai une méthode qui boucle à travers la classe de collection (Contacts) et enregistre chaque enregistrement (Contact). J'utilise la réflexion parce que ma méthode ne saura pas si c'est une classe Contacts ou une classe Client et ainsi de suite. Voici mon code en VB (édulcoré)C# accéder aux propriétés d'un objet d'une classe de collection

Public Function SaveCollection(ByVal objCollection as Object, ByVal TableName as string, ByVal spSave as string) 

Dim objClass as Object 
Dim propInfo as PropertyInfo 

For Each objClass in objCollection 

    propInfo = objClass.GetType.GetProperty("TableFieldName") 


Next 

End Function 

Je rencontre des problèmes en C# avec le objClass.GetType.GetProperty ("TableFieldName") ligne

Voici mon code C#

public in SaveCollection(DictionaryBase objCollection, string TableName, string spSave) 
{ 
    PropertyInfo propInfo; 

    foreach (DictionaryEntry objClass in objCollection) 
     { 
     propInfo = objClass.GetType().GetProperty("TableFieldName") 

     } 

} 

Le code C# continue de renvoyer la valeur null. Dans la fenêtre de mes locaux, je peux voir les propriétés de la classe sur objClass et la valeur de la propriété, mais je peux sembler comprendre comment y accéder à travers le code. J'ai utilisé le DictionaryBase parce que cela semble correspondre étroitement que je devrais faire. Ma classe de données (Contact) a un groupe ou des propriétés qui correspondent aux noms de champs dans la base de données de la table des contacts. Après avoir obtenu l'ensemble de variables propInfo, j'ai ensuite configuré mon paramètre SQLParameter avec le nom de champ, le type de données, etc., puis définissez la valeur sur propInfo.value.

Merci pour l'aide.

Répondre

1

vous devez obtenir la valeur afterwords. Notez également que GetValue retourne un object, vous pouvez le jeter aux cordes ou int ou quel que soit le type de la valeur si vous savez que TableFieldName sera une chaîne puis changez cette ligne que vous attendez est en vogue.

public in SaveCollection(DictionaryBase objCollection, string TableName, string spSave) 
{ 
    PropertyInfo propInfo; 

    foreach (DictionaryEntry objClass in objCollection) 
     { 
      object tempObj = objClass.Value; 
      propInfo = tempObj.GetType().GetProperty("TableFieldName"); 

      object[] obRetVal = new Object[0]; 
      object value = propInfo.GetValue(tempObj,obRetVal); 
     } 

} 

.

string value = propInfo.GetValue(tempObj,obRetVal) as string; 
+0

Merci. Votre extrait de code m'a amené dans la bonne direction. – VBCSharp

+0

de rien. –

3

Il semble que vous transmettiez une collection différente au code VB et au code C#. Ma conjecture est que dans le code VB vous passez les valeurs d'un dictionnaire et en C# vous passez le dictionnaire lui-même. Essayez de changer la ligne C# pour la

suivante
propInfo = objClass.Value.GetType().GetProperty("TableFieldName"); 
+2

+1 De toute évidence, DictionaryEntry n'a pas cette propriété. –

+2

Et ne peut jamais avoir, étant donné que c'est une structure. (c'est-à-dire que vous ne pourrez pas dériver un nouveau type avec cette propriété à partir de DictionaryEntry.) –

0

Vous regardez les propriétés de la classe DictionaryEntry. Pas la classe de la valeur dans la paire clé-valeur particulière. Envisagez d'essayer d'utiliser objClass.Value.GetType().GetProperty("TableFieldName").

2

Je ne vois pas pourquoi vous utilisez un dictionnaire ici - si c'est juste une collection, pourquoi ne pas IEnumerable? Avez-vous actuellement une clé ici que vous stockez des choses?

DictionaryEntry n'aura jamais une propriété TableFieldName. Êtes-vous sûr de ne pas avoir besoin de prendre la valeur (ou clé) dans DictionaryEntry (en utilisant les propriétés Value ou Key).

Avez-vous vraiment besoin de le faire avec la réflexion? Vous ne pouvez pas utiliser une méthode générique à la place, après avoir défini une interface commune qui a la propriété TableFieldName? Par exemple:

public void SaveCollection<T>(IEnumerable<T> collection) 
    where T : ITableDescriptor 
{ 
    foreach (T element in collection) 
    { 
     string tableFieldName = element.TableFieldName; 
     // use the table field name here 
    } 
} 
+0

Merci. J'ai créé mon code VB original il y a environ 4 ans et je l'utilise depuis. En y jetant un autre coup d'œil tout en le convertissant, je me demande pourquoi j'ai utilisé Reflection en premier lieu. – VBCSharp

0

Pensez également à passer aux génériques si vous le pouvez. Je pense que vous devriez être en mesure de faire quelque chose comme ceci:

VB:

Private l As List(Of MyClassName) 

C#:

private List<MyClassName> l; 

Vous voudrez peut-être de ne pas utiliser une liste, mais il est juste un exemple. Après cela, l'accès aux membres de chaque élément de la liste peut se faire via intellisense. Souvent, les génériques peuvent aussi être plus rapides car vous n'avez pas besoin de faire de casting.

Questions connexes