Cast ExpandoObject de type anonyme
Puis-je cast ExpandoObject de type anonyme ?
var anoObj = new { name = "testName", email = "testEmail" };
dynamic expandoObj = new System.Dynamic.ExpandoObject();
//Here I'm populating the expandoObj with same property names/types in anonymoustype(anoObj)
//Now, how to convert this ExpandoObject to anonymoustype ?
var newObj = (typeof(anoObj)expandoObj); //This doesn't work
Ajouté Plus Tard
//Ceci est mon entité
public class Customer
{
#region Public Properties
[ColumnAttribute(Name = "IdColumn")]
public string Id { get; set; }
[ColumnAttribute(Name = "NameColumn")]
public string Name { get; set; }
[ColumnAttribute(Name = "AddressColumn")]
public string Address { get; set; }
[ColumnAttribute(Name = "EmailColumn")]
public string Email { get; set; }
[ColumnAttribute(Name = "MobileColumn")]
public string Mobile { get; set; }
#endregion
}
//-------------------------------------------------------------------------------------
public class LookupService<TEntitySource>
{
public LookupService ()
{
}
public LookupShowable<TEntitySource, TSelection> Select<TSelection>(Expression<Func<TEntitySource, TSelection>> expression)
{
var lookupShowable = new LookupShowable<TEntitySource, TSelection>();
return lookupShowable;
}
}
public class LookupShowable<TEntitySource,TSelection>
{
public LookupShowable()
{
}
public LookupExecutable<TEntitySource, TSelection, TShow> Show<TShow>(Expression<Func<TEntitySource, TShow>> expression)
{
var lookupExecutable = new LookupExecutable<TEntitySource,TSelection,TShow>();
return lookupExecutable;
}
}
public class LookupExecutable<TEntitySource, TSelection, TShow>
{
public TSelection Execute()
{
//Here I want to create a new instance of TSelection and populate values from database and return it.
}
}
//--------------------------------------------------------------------------------------
//This is How I want to call this from front end...
var lookupService = new LookupService<Customer>();
var lookupSelection = lookupService.Select(C => new { C.Id, C.Name, C.Mobile }).Show(C => new { C.Id, C.Name}).Execute();
string sID = lookupSelection.Id;
string sName = lookupSelection.Name;
string sMobile = lookupSelection.Mobile;
Ne pense pas que sur cette partie centrale.. But de cela est une autre...
Mon problème est dans la méthode Execute() LookupExecutable classe. Je ne sais pas comment créer une nouvelle instance de TSelection type et lui affecter des valeurs. Cette TSelection type est toujours un type anonyme..
- Pourquoi pensez-vous que vous voulez faire ce que vous en pensez?
- Je veux créer un type anonyme dynamiquement et de lui affecter des valeurs dynamiquement.
- mais pourquoi? Que voulez-vous faire avec ça?
- Ceci est lié à stackoverflow.com/questions/10240487/... question. mais ALORS, a fermé à cette question. Comment créer une nouvelle instance de type générique(TResult) qui sera toujours un anonyme tapé. et comment faire pour assigner des valeurs aux propriétés de cette nouvelle instance ?
- Vous ne semblez pas comprendre ce qu'est "anonyme" signifie.
- Même si vous pourriez lancer au anonymes de type, ils sont toujours en lecture seule, de toute façon... merci de nous donner plus d'informations sur la plus grande image de ce que vous essayez d'accomplir - pas la façon de pensée de l'accomplir.
- Ok Jon, Im taper en entier ici.. je veux un min.
- Un peu l'inverse: how-do-i-iterate-over-the-properties-of-an-anonymous-object-in-c
InformationsquelleAutor Sency | 2012-04-20
Vous devez vous connecter pour publier un commentaire.
EDIT: je pense que cette question est un excellent exemple de la XY problème. La bonne solution n'a pas besoin de se préoccuper de
ExpandoObject
ou les types anonymes, et il serait plus probable de mal, si il l'a fait.Vous êtes à la recherche à de la mauvaise façon. Vous n'avez pas besoin de créer une instance d'un objet anonyme, vous devez appeler le code qui est passé à vous dans une expression (qui peut ou peut ne pas être la création d'un objet anonyme).
Si vous pouvez créer une instance de
TEntitySource
, alors c'est simple:Compiler()
laExpression
que vous avez obtenu dansSelect()
et ensuite invoquer pour chaque instance deTEntitySource
.Si vous ne pouvez pas créer de
TEntitySource
, vous pouvez toujours le faire par la réécriture de l'Expression
(à l'aide deExpressionVisitor
), de sorte que son entrée n'est pasTEntitySource
, mais un certain type que vous avez. Mais qui nécessite un certain travail de votre part.Réponse originale à cette question:
Non, cela ne marchera pas. Ce n'est tout simplement pas la façon de coulée, d'anonymes ou de types de travail en C#.
Vous ne pouvez pas jeter entre les deux types et espérer qu'il fonctionne. Soit l'objet que vous êtes à la coulée doit être le type coulée, ou l'un des deux types de besoins pour spécifier une correspondance opérateur de cast.
Le fait que le type de cible est un type anonyme ne change rien (sauf que vous ne pouvez même pas essayer de jeter un type anonyme directement, parce que vous ne pouvez pas le nom; la façon dont vous utilisez
typeof()
est faux).Le fait que le type de source est
dynamic
change un peu les choses. Mais seulement dans la recherche de l'opérateur de cast est fait au moment de l'exécution, et non pas au moment de la compilation, et vous pouvez même créer l'opérateur de cast à l'exécution (voirDynamicObject.TryCast()
). Mais c'est tout, il ne pas ajouter de “magique” des opérateurs de transtypage.La seule façon que je peux imaginer quelque chose comme ce serait le cas si vous avez utilisé une variante de “cast par exemple” et de réflexion:
Vous pouvez utiliser quelque chose comme ceci:
Notez que vous ne pouvez pas invoquer
Convert()
de manière dynamique (en passant ildynamicExpando
), car cela signifierait qu'il serait de retourdynamic
trop.Utilisation JavaScriptSerializer pour convertir le ExpandoObject à n'importe quel Type comme suit:
Cela devrait faire le travail.
ici, vous avez un objet madre à partir d'un ExpandoObject
Mais attention, les objets dynamiques sont très très cher dans les questions de ressources, et ce que vous demandez ne semble pas avoir de sens. Une bonne approche pour ce que vous demandez dans les commentaires, en supposant que vous avez à traiter avec les objets dynamiques et vous voulez faire quelque chose avec eux:
Tout système dynamyc objet est facilement intégré à un typée Dicionary.
Espère que ça aide!