2017-04-04 2 views
0

Je souhaite déclarer un dictionnaire vb.net avec un entier comme clé et un objet anonyme comme valeur. Ceci est rempli par un parallèle pour chaque boucle. Les propriétés de la classe anonyme sont toujours les mêmes. Mais existe-t-il un moyen de déclarer le dictionnaire avec la signature de l'objet anonyme?Déclaration du dictionnaire (Of Integer, AnonymousType) dans vb.net

À l'heure actuelle, j'utilise un dictionnaire d'entier et d'objet.

Dim MyDict As New Dictionary(Of String, Dictionary(Of Integer, Object))(12) 
'In my loop 
Dim MyLinqDict = Something.GroupBy(…).ToDictionary(Function(x) x.Kex, Function(x) New With {.a = 1, .b = 2}) 
MyDict.Add(MyKey, MyLinqDict) 

Maintenant, le problème évident est que le contenu de ce dictionnaire interne est juste un objet. Je ne sais pas, si, et, si oui, comment je peux déclarer cette dictée intérieure avec l'objet réel. Je ne sais pas, si je peux classer ce "Objet" comme le type anonyme.

Dim MyContent = DirectCast(MyDict("Some key")(1), ???).a 

Quelqu'un peut-il m'aider à cet égard?

+0

Vous ne pouvez pas l'avoir dans les deux sens. C'est anonyme ou pas. Si vous devez être capable de lancer et avoir un accès défini à la propriété 'a', vous devez le définir au lieu d'utiliser l'objet. Si vous voulez l'anonymat, vous devez juste croire que vous n'obtiendrez pas d'objet qui n'a pas 'a' –

+0

Les types anonymes sont une commodité Linq. Ils cessent d'être pratique quand vous devez le faire. Donc, ne faites pas cela, déclarez une petite classe d'aide pour stocker le résultat. Maintenant c'est simple. –

Répondre

4

Si comme vous le dites, les propriétés vont toujours être le même, il suffit de créer une nouvelle classe et le remplir:

Dim MyDict As New Dictionary(Of String, Dictionary(Of Integer, MyObject))(12) 

Dim MyLinqDict = Something.GroupBy(…).ToDictionary(Function(x) x.Kex, Function(x) New MyObject With {.a = 1, .b = 2}) 

Public Class MyObject 
    Public Property a() As Integer 
    Public Property b() As Integer 
End Class 

Problème résolu!

+0

Merci! C'était la solution. –

+0

De rien! – Ric

1

Non. Le type est inconnu, car il est .. bien anonyme.

Si toutes les valeurs ont le même nombre d'éléments, Tuple peut être utilisé à la place:

Dim d1 = New Dictionary(Of Integer, Dictionary(Of Integer, Tuple(Of Integer, Integer))) 

Dim d2 = {1, 2}.ToDictionary(Function(i) i, Function(i) Tuple.Create(1, 2)) 

d1.Add(0, d2) 

Dim MyContent = d1(0)(1).Item1 
0

Créer une classe simple POCO. C'est vraiment la meilleure solution. En théorie, vous pouvez utiliser des classes anonymes avec une inférence de type générique si vous créez des méthodes auxiliaires génériques.

static Dictionary<TKey, TValue> Create<TKey, TValue>(TKey sampleKey, TValue sampleValue) 
{ 
    return new Dictionary<TKey, TValue>(); 
} 

static TValue GetValueForKey<TKey, TValue>(IDictionary<TKey, TValue> dic, TKey key) 
{ 
    return dic[key]; 
} 

// Usage 
var anonymousObject = new { a = "a_ok", b = "b_ok" }; 
var dic = Create(0, anonymousObject); // Only creates the dictionary 
dic.Add(1, anonymousObject);   // Adds a key/value pair 

var value = GetValueForKey(dic, 1).a; // Yields "a_ok"