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.
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
Vous devez vous connecter pour publier un commentaire.
C'est assez facile (et vous êtes déjà à le faire).
Que vous obtiendrez le béton type de l'objet
C'est là que les choses se fourvoyer un peu. L'opérateur de coulée en C# (l'utilisation de ce qui est ce que les gens qualifient de "casting") peut faire deux choses:
Dans votre cas, la première option est de droit; l'opérateur de coulée, comme tous les opérateurs, n'est pas polymorphe. C'est, un opérateur est appliqué uniquement si elle est définie sur le type qui est référencé, pas la objet qui est référencé. Si vous souhaitez davantage de précisions sur ce, permettez-moi de le savoir, mais je ne pense pas que c'est pertinent à votre question si je ne vais pas aller plus loin à moins que demandé.
La deuxième option est la seule option qui pourrait raisonnablement s'appliquer à vous, mais considère que les deux seules raisons pour lesquelles vous voulez faire:
object
, donc c'est à peu près aussi haut qu'il se passe)(La grande majorité des distributions sont la raison #1)
La raison que vous souhaitez utiliser l'une de ces options est de sorte que vous pouvez avoir fortement typées objet et utiliser les différents membres définis sur ce type. Mais toutes ces choses ne s'appliquent à des types que vous savoir lorsque vous avez écrit le code. Il n'est pas judicieux de jeter un type qui est inconnu au moment de la compilation, comme le casting ne fait rien à l'objet réel (il est, et restera, de son vrai type; la seule chose qui change, c'est le type de la variable par qui référence de l'objet).
Si vous pouvez fournir une plus étoffé, exemple de ce que vous êtes en train d'essayer de faire (avec le code que vous auriez aimez soit ou espérer qu'il fonctionne), je pourrais être en mesure de fournir quelque chose modélisé un peu plus proche de ce que vous voulez, mais comme il est décrit c'est aussi spécifique que je peux obtenir.
OriginalL'auteur Adam Robinson
Tout d'abord: ce n'est pas "la boxe". La boxe est pour les types de valeur, comme
struct
s.Deuxième de tous: Ce que vous avez probablement besoin est soit:
Reflection.Emit
.Tiers de tous: Votre exemple de code ne
variable1 as variable2
, qui n'a pas vraiment de sens. :\ Ce que avez-vous l'intention de faire après cela? Peut-être il ya une meilleure façon.OriginalL'auteur Downvoter
Juste pour que nous soyons sur la même page, laissez-moi vous expliquer pourquoi cela est impossible.
var
est un moment de la compilation de construire. Il est, identique à la déclaration de la variable avec le type approprié de suite. En plus d'être plus facile à taper, c'est l'utilisation principale est pour les types anonymes qui, comme le sous-entend, n'ont pas de noms.De toute façon, pour obtenir de la viande de votre question, votre meilleur pari est d'utiliser la génération de code Dynamique, que ce soit avec
Reflection.Emit
ouCodeDom
(le dernier est beaucoup plus facile à comprendre si vous ne savez pas ILASM, mais est beaucoup plus lent).En fonction de ce que vous voulez vraiment faire, vous pourriez être en mesure de s'en tirer avec quelque chose comme
Mais, si vous pouvez vous attendre littéralement n'importe quel type, eh bien... bonne chance.
sur ce que vous voulez vraiment faire j'ai compris que pour une raison 😉
OriginalL'auteur Mike Caron
Comment voulez-vous gérer ça, si le type n'est connu au moment de l'exécution? Vous ne pouvez pas appeler une classe spécifique méthodes parce que vous ne connaissez pas le type exact de toute façon, à moins que tous les objets partagent un ensemble de méthodes qui peuvent être extraites en tant qu'interface.
Fondamentalement, vous avez plusieurs options:
Utilisation
is
et faire des choses différentes pour les différents types:Si tous les types possibles sont censés partager un ensemble d'opérations, l'utilisation d'une interface:
Reformuler votre question et à étendre l'échantillon avec la façon dont vous le voyez de travail après que vous avez fait le " magique moule. Cela nous donnerait l'idée de ce que vous essayez d'accomplir.
OriginalL'auteur Dan Abramov
Vous pouvez utiliser
dynamic
:Ceci devrait compiler et de travail.
OriginalL'auteur Alex Aza