type read custom c# reflection anonymous-objects

c# - read - Agregar propiedad al tipo anónimo después de la creación



read dynamic object c# (4)

La siguiente clase de extensión le proporcionará lo que necesita.

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

Uso un objeto anónimo para pasar mis atributos Html a algunos métodos auxiliares. Si el consumidor no agregó un atributo de ID, quiero agregarlo en mi método de ayuda.

¿Cómo puedo agregar un atributo a este objeto anónimo?


Si intentas extender este método:

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);

Aunque estoy seguro de que las extensiones de objeto de Khaja funcionarían, puede obtener un mejor rendimiento creando un RouteValueDictionary y pasando el objeto routeValues, agregue sus parámetros adicionales desde el contexto y luego regrese utilizando la sobrecarga de ActionLink que toma un RouteValueDictionary en lugar de un objeto:

Esto debería funcionar:

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


Supongo que te refieres a los tipos anónimos aquí, p. Ej. new { Name1=value1, Name2=value2} etc. Si es así, no tienes suerte: los tipos anónimos son tipos normales en el sentido de que son código compilado y fijo. Simplemente resultan autogenerados.

Lo que podrías hacer es escribir new { old.Name1, old.Name2, ID=myId } pero no sé si eso es realmente lo que quieres. Algunos detalles más sobre la situación (incluyendo muestras de código) serían ideales.

Alternativamente, podría crear un objeto contenedor que siempre tuviera una ID y cualquier otro objeto que contuviera el resto de las propiedades.


public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}

Esto aceptaría el valor de identificación que el cuadro de texto debería tener y la etiqueta debería referirse a. Si el consumidor ahora no incluye la propiedad "id" en textBoxHtmlAttributes, el método creará una etiqueta incorrecta.

Puedo verificar a través de la reflexión si este atributo se agrega en el objeto labelHtmlAttributes. Si es así, quiero agregarlo o crear un nuevo objeto anónimo que lo tenga agregado. Pero como no puedo crear un nuevo tipo anónimo al recorrer los viejos atributos y agregar mi propio atributo "id", estoy algo atrapado.

Un contenedor con una propiedad de ID fuertemente tipada y luego una propiedad anónima de "atributos" mecanografiados requeriría reescrituras de código que no pesen hasta el requisito de "agregar un campo de identificación".

Espero que esta respuesta sea comprensible. Es el final del día, no puedo poner mis cerebros en línea nunca más ...