Aggiungi proprietà al tipo anonimo dopo la creazione
-
04-07-2019 - |
Domanda
Uso un oggetto anonimo per passare i miei attributi HTML ad alcuni metodi di supporto. Se il consumatore non ha aggiunto un attributo ID, voglio aggiungerlo nel mio metodo di supporto.
Come posso aggiungere un attributo a questo oggetto anonimo?
Soluzione
Se stai cercando di estendere questo metodo:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);
Anche se sono sicuro che le estensioni degli oggetti di Khaja funzionerebbero, potresti ottenere prestazioni migliori creando un RouteValueDictionary e passando l'oggetto routeValues, aggiungi i parametri aggiuntivi dal contesto, quindi ritorna utilizzando il sovraccarico ActionLink che accetta un RouteValueDictionary invece di un oggetto:
Questo dovrebbe fare il trucco:
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);
}
Altri suggerimenti
La seguente classe di estensione ti fornirà ciò di cui hai bisogno.
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;
}
}
Suppongo che intendi tipi anonimi qui, ad es. new {Name1 = value1, Name2 = value2}
ecc. In tal caso, sei sfortunato: i tipi anonimi sono tipi normali in quanto codice fisso, compilato. Capita solo di essere generati automaticamente.
Quello che potresti è scrivere new {old.Name1, old.Name2, ID = myId}
ma non so se è davvero quello che vuoi. Qualche dettaglio in più sulla situazione (inclusi esempi di codice) sarebbe l'ideale.
In alternativa, puoi creare un oggetto contenitore che sempre aveva un ID e qualunque altro oggetto contenesse il resto delle proprietà.
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}
Questo accetterebbe il valore ID che la casella di testo dovrebbe avere e l'etichetta dovrebbe fare riferimento. Se il consumatore ora non include l '"id" nella proprietà textBoxHtmlAttributes, il metodo creerà un'etichetta errata.
Posso verificare attraverso la riflessione se questo attributo viene aggiunto nell'oggetto labelHtmlAttributes. In tal caso, voglio aggiungerlo o creare un nuovo oggetto anonimo a cui è stato aggiunto. Ma poiché non riesco a creare un nuovo tipo anonimo esaminando i vecchi attributi e aggiungendo il mio "id" attributo, sono un po 'bloccato.
Un contenitore con una proprietà ID fortemente tipizzata e quindi un tipo "anonimo" e attributi; la proprietà richiederebbe riscritture di codice che non pesano fino al " aggiungi un campo id " requisito.
Spero che questa risposta sia comprensibile. È la fine della giornata, non riesco più a mettere in riga il mio cervello ..