Adicionar propriedade para tipo anônimo após a criação
-
04-07-2019 - |
Pergunta
Eu uso um objeto anônimo para passar meu atributos HTML para alguns métodos auxiliares. Se o consumidor não adicionar um atributo ID, quero adicioná-lo no meu método auxiliar.
Como posso adicionar um atributo a este objeto anônimo?
Solução
Se você está tentando estender esse método:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);
Embora eu tenho certeza extensões de objetos de Khaja iria funcionar, você pode obter um melhor desempenho, criando um RouteValueDictionary e passando nas routeValues ??objeto, adicionar seus parâmetros adicionais a partir do contexto, em seguida, retornar usando a sobrecarga ActionLink que leva um RouteValueDictionary em vez de um objeto:
Isso deve fazer o truque:
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);
}
Outras dicas
A seguir classe de extensão iria conseguir o que você precisa.
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;
}
}
Eu suponho que você quer dizer tipos anônimos aqui, por exemplo, new { Name1=value1, Name2=value2}
etc. Se assim for, você está fora de sorte - tipos anônimos são tipos normais em que eles estão fixos, o código compilado. Eles só acontecerá a ser gerada automaticamente.
O que você poderia fazer é escrever new { old.Name1, old.Name2, ID=myId }
mas eu não sei se isso é realmente o que você quer. Alguns mais detalhes sobre a situação (incluindo amostras de código) seria o ideal.
Como alternativa, você pode criar um objeto de recipiente que sempre tinha um ID e qualquer outro objeto contido o resto das propriedades.
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}
Este seria aceitar o valor ID de caixa de texto deve ter e o rótulo deve referir-se. Se o consumidor já não inclui a propriedade "id" no textBoxHtmlAttributes, o método irá criar um rótulo incorreto.
posso verificar através da reflexão se este atributo é adicionado no objeto labelHtmlAttributes. Se assim for, eu quero adicioná-lo ou criar um novo objeto anônimo que tem acrescentou. Mas porque eu não posso criar um novo tipo anônimo Ao percorrer os antigos atributos e adicionando meu próprio atributo "id", eu sou o tipo de preso.
Um recipiente com uma propriedade ID fortemente digitado e, em seguida, um anônimo digitado "atributos" propriedade exigiria reescrever código que não pesam até o "adicionar um campo id" exigência.
Hope esta resposta é compreensível. É o fim do dia, não é possível obter o meu cérebro em linha mais ..