Ajouter une propriété à un type anonyme après la création

J’utilise un object anonyme pour transmettre mes atsortingbuts HTML à certaines méthodes d’assistance. Si le consommateur n’a pas ajouté d’atsortingbut ID, je souhaite l’append dans ma méthode d’assistance.

Comment puis-je append un atsortingbut à cet object anonyme?

Si vous essayez d’étendre cette méthode:

public static MvcHtmlSsortingng ActionLink(this HtmlHelper htmlHelper, ssortingng linkText, ssortingng actionName, object routeValues); 

Bien que les extensions Object de Khaja fonctionnent, vous obtiendrez de meilleures performances en créant un RouteValueDictionary et en transmettant l’object routeValues, en ajoutant vos parameters supplémentaires à partir du contexte, puis en utilisant la surcharge ActionLink qui prend un RouteValueDictionary au lieu d’un object:

Cela devrait faire l’affaire:

  public static MvcHtmlSsortingng MyLink(this HtmlHelper helper, ssortingng linkText, ssortingng actionName, object routeValues) { RouteValueDictionary routeValueDictionary = new RouteValueDictionary(routeValues); // Add more parameters foreach (ssortingng parameter in helper.ViewContext.RequestContext.HttpContext.Request.QuerySsortingng.AllKeys) { routeValueDictionary.Add(parameter, helper.ViewContext.RequestContext.HttpContext.Request.QuerySsortingng[parameter]); } return helper.ActionLink(linkText, actionName, routeValueDictionary); } 

La classe d’extension suivante vous procurerait ce dont vous avez besoin.

 public static class ObjectExtensions { public static IDictionary AddProperty(this object obj, ssortingng name, object value) { var dictionary = obj.ToDictionary(); dictionary.Add(name, value); return dictionary; } // helper public static IDictionary ToDictionary(this object obj) { IDictionary result = new Dictionary(); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj); foreach (PropertyDescriptor property in properties){ result.Add(property.Name, property.GetValue(obj)); } return result; } } 

Je suppose que vous voulez dire des types anonymes ici, par exemple new { Name1=value1, Name2=value2} etc. Si oui, vous n’avez pas de chance – les types anonymes sont des types normaux dans la mesure où ils sont corrigés. Ils se trouvent juste être autogénérés.

Ce que vous pourriez faire, c’est écrire new { old.Name1, old.Name2, ID=myId } mais je ne sais pas si c’est vraiment ce que vous voulez. Quelques détails supplémentaires sur la situation (y compris des exemples de code) seraient idéaux.

Vous pouvez également créer un object conteneur qui a toujours un ID et tout autre object contenant le rest des propriétés.

 public static ssortingng TextBox(this HtmlHelper html, ssortingng value, ssortingng labelText, ssortingng textBoxId, object textBoxHtmlAtsortingbutes, object labelHtmlAtsortingbutes){} 

Cela accepterait la valeur de l’ID que devrait avoir la zone de texte et l’étiquette devrait faire référence à. Si le consommateur n’inclut plus la propriété “id” dans textBoxHtmlAtsortingbutes, la méthode créera une étiquette incorrecte.

Je peux vérifier par reflection si cet atsortingbut est ajouté dans l’object labelHtmlAtsortingbutes. Si oui, je veux l’append ou créer un nouvel object anonyme qui l’a ajouté. Mais comme je ne peux pas créer un nouveau type anonyme en parcourant les anciens atsortingbuts et en ajoutant mon propre atsortingbut “id”, je suis un peu coincé.

Un conteneur avec une propriété ID fortement typée, puis une propriété “atsortingbuts” typée anonyme nécessiterait des réécritures de code qui ne pèsent pas dans la condition “append un champ id”.

J’espère que cette réponse est compréhensible. C’est la fin de la journée, je ne peux plus faire la queue.