Coulé en Boîte de l'Objet à l'Origine de Type

Je m'attends il y a une des deux réponses à cela, que ce soit impossible ou extrêmement simple et j'ai négligé l'évidence Google requête.

La question sous-jacente est que j'ai un objet générique, transmis par le biais d'un EventHandler que les boîtes de l'objet et dissimule le vrai type; qu'à l'exécution puis-je savoir ce que l'objet est.

Certes, la dynamic mot-clé peut contourner le problème, mais j'aimerais ne pas perdre IntelliSense et tout, si je peux l'éviter. De Plus, il ne résout pas le problème de ne pas savoir ce que chacun de ces propriétés de l'objet générique, sans d'énormes quantités de réflexion.

EDIT: L'idée est d'être en mesure de déterminer le vrai type de l'objet dans un paramètre d'une méthode, puis jeté que l'objet tel qu'il est vrai type, sans le savoir, à l'avance. Ce n'est qu'un exemple simplifié. Boîte peut avoir été le mauvais terme.

Un exemple:

public class Program
{
    static void Main(string[] args)
    {
        var container = new Container<Containee>(
            new Containee
            {
                Property1 = Guid.NewGuid(),
                Property2 = "I'm a property!",
                Property3 = DateTime.Now
            }
        );

        var boxed = (object)container;

        var originalType = boxed.GetType();

        //DOES NOT COMPILE: would like an operation like this
        //EDIT: Request for more detail
        var actualType = boxed as originalType;
        actualType.Entity.Property2 = "But I like this better.";
    }
}

public class Containee
{
    public Guid Property1 { get; set; } 
    public string Property2 { get; set; }
    public DateTime Property3 { get; set; }
}

public class Container<T>
{
    public Container(T entity)
    {
        Entity = entity;
    }

    public T Entity { get; internal set; }
}

Clairement que ne compile pas, car il n'y a pas vraiment moyen de jeter comme une variable. Cependant, j'espère qu'il y a un moyen pour obtenir une référence à l'objet réel et le type, ou au moins, d'une façon dynamique de re-créer le type.

Je m'attends il y a quelque chose de simple, je suis dominant, ou une meilleure façon de la contourner en général. Le point est d'être en mesure d'envelopper un objet dans le conteneur, et la figure plus ce qu'il était.

Je ne vois pas de boxe dans votre code. Ce que vous devez faire var actualType = boxed as Container<Containee>; pour le rendre compilable. `
Boxe de classes ne se produisent pas. Seuls les types de valeur (int, etc) sont mis en boîte. Le mot que vous cherchez est casting. Vous avez coulé en boîte de l'objet.
Je pense que l'exemple de code est. Il mentionne un gestionnaire d'événement, pensez donc à ce que la réception object sender. Il veut savoir si il existe un moyen au moment de la compilation pour obtenir le vrai type de retour et profitez des avantages de l'intellisense.
Ce n'est pas de la boxe. @Richard est correcte; la boxe est la création d'un référencés wrapper de sorte qu'une valeur de type peuvent être stockés sur le tas.
Je ne pense pas que vous avez à venir à travers les clairement. Vous dites que vous ne voulez pas "perdre IntelliSense et tout", mais si vous ne connaissez pas le type de la variable au moment où vous avez écrit le code, ce qui ne intellisense vous donner? Vous ne pouvez pas lancer un objet d'un type inconnu, qu'il n'aurait pas d'effet pratique.

OriginalL'auteur falquan | 2011-06-10