Question

Je Dictionary(TKey, TValue) comme

Dictionary<int, ArrayList> Deduction_Employees = 
    new Dictionary<int, ArrayList>();

et plus tard ajouter à cette liste de tableau d'un type anonyme comme celui-ci

var day_and_type = new {
    TheDay = myDay,
    EntranceOrExit = isEntranceDelay
};

Deduction_Employees[Employee_ID].Add(day_and_type);

Maintenant, comment puis-je unbox que var et accéder à ces propriétés ??

Était-ce utile?

La solution

D'abord, vous n'êtes pas unboxing le type. Les types anonymes sont les types de référence, et non des structures.

Même si techniquement, vous pouvez créer des instances du même type en dehors de la méthode qu'ils ont été déclarés dans (conformément à l'article 7.5.10.6 du C # 3.0 Spécification du langage, qui stipule que:

  

Dans le même programme, deux anonymes   initializers d'objet qui spécifient un   séquence des propriétés de la même   Les noms et les types de compilation dans le   même ordre produira des cas de   le même type anonyme.

) vous avez aucun moyen d'obtenir le nom du type, dont vous avez besoin pour effectuer la distribution de Object revenir au type que vous avez créé. Vous devrez recourir à un solution cast par exemple qui est intrinsèquement viciée.

Cast par exemple est erronée parce que du point de vue de la conception, chaque endroit que vous souhaitez accéder au type en dehors de la fonction elle est déclarée (et toujours à l'intérieur du même module), vous devez déclarer efficacement le type tout recommencer .

Il est une duplication des efforts qui conduit à la conception bâclée et la mise en œuvre.

Si vous utilisez .NET 4.0, alors vous pourrait placer l'instance d'objet dans une variable dynamique. Cependant, l'inconvénient majeur est l'absence de vérification de la compilation de l'accès des membres. Vous pouvez facilement orthographier le nom du membre, et vous avez une erreur d'exécution au lieu d'une erreur de compilation.

En fin de compte, si vous trouvez la nécessité d'utiliser un type anonyme en dehors de la méthode, il est déclaré, la seule bonne solution est de créer un type concret et remplacer le type anonyme pour le type de béton .

Autres conseils

Il existe plusieurs façons.

Étant donné que les commentaires semble indiquer que je vous suggère de le faire, permettez-moi de dire clairement:. Vous devez créer un type du nom de votre objet puisque vous l'intention de le transmettre autour

D'abord, vous pouvez utiliser la réflexion, une autre réponse qui a déjà fait ici sur.

Une autre façon, qui astuces .NET en vous donnant le type est connu sous le nom « jeté par exemple », et il va quelque chose comme ceci: Vous devez passer votre objet à travers un appel de méthode générique, qui renverra l'objet comme le type, en déduisant le type de retour.

Par exemple, essayez ceci:

private static T CastByExample<T>(T example, object value)
{
    return (T)value;
}

et de l'utiliser:

var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj);

pour les deux ?? taches, vous avez juste besoin de passer quelque chose monter le type de données pour ces propriétés, les valeurs ne seront pas utilisées.

exploite le fait que plusieurs types anonymes contenant exactement les mêmes propriétés, du même type, dans le même ordre, dans le même ensemble, tracera au même type unique.

Cependant, cette fois-ci, vous devriez être à la place d'un type crée le nom.

  

Un type anonyme a une portée de la méthode. Pour passer un type anonyme, ou une collection qui contient des types anonymes, en dehors d'une limite de méthode, vous devez d'abord jeter le type d'objet. Cependant, cette vainc la forte frappe du type anonyme. Si vous devez stocker vos résultats de la requête ou les passer en dehors des limites de la méthode, envisager d'utiliser un lieu struct ordinaire du nom ou de la classe d'un type anonyme.

Source: http://msdn.microsoft.com/en-us /library/bb397696.aspx

Non, vous ne pouvez pas. Vous ne pouvez accéder aux propriétés en utilisant la réflexion. Le compilateur n'a aucun moyen de savoir ce que le type était, et comme il est un type anonyme, vous ne pouvez pas jeter non plus.

Si vous utilisez 1.x .NET -. 3.x, vous devez utiliser la réflexion

Si vous utilisez .NET 4.0, vous pouvez utiliser un type dynamique et appeler les propriétés attendues.

Dans les deux cas, vous devez unbox; qui est pour les types de valeur. Les types anonymes sont toujours des types de référence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top