Voeg eigenschap toe aan anoniem type na aanmaak

Ik gebruik een anoniem object om mijn Html-kenmerken door te geven aan sommige hulpmethoden.
Als de consument geen ID-kenmerk heeft toegevoegd, wil ik dit toevoegen aan mijn helpermethode.

Hoe kan ik een attribuut aan dit anonieme object toevoegen?


Antwoord 1, autoriteit 100%

De volgende extensieklasse geeft je wat je nodig hebt.

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;
    }
}

Antwoord 2, autoriteit 68%

Ik neem aan dat je hier anonieme typen bedoelt, b.v. new { Name1=value1, Name2=value2}etc. Als dat zo is, heb je pech – anonieme typen zijn normale typen in die zin dat het vaste, gecompileerde code is. Ze zijn toevallig automatisch gegenereerd.

Wat u zoukunt doen, is new { old.Name1, old.Name2, ID=myId }schrijven, maar ik weet niet of dat echt is wat u wilt. Wat meer details over de situatie (inclusief codevoorbeelden) zou ideaal zijn.

U kunt ook een containerobject maken dat altijdeen ID had en welk ander object dan ook de rest van de eigenschappen.


Antwoord 3, autoriteit 22%

Als je deze methode probeert uit te breiden:

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

Hoewel ik zeker weet dat Khaja’s Object-extensies zouden werken, zou u betere prestaties kunnen krijgen door een RouteValueDictionary te maken en het routeValues-object door te geven, uw aanvullende parameters uit de context toe te voegen en vervolgens terug te keren met de ActionLink-overbelasting waarvoor een RouteValueDictionary nodig is in plaats van een object:

Dit zou het moeten doen:

   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);
    }

Antwoord 4

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

Hierdoor wordt de id-waarde geaccepteerd die het tekstvak zou moeten hebben en waarnaar het label zou moeten verwijzen.
Als de consument de eigenschap “id” nu niet opneemt in de textBoxHtmlAttributes, zal de methode een onjuist label maken.

Ik kan via reflectie controleren of dit attribuut is toegevoegd in het labelHtmlAttributes-object. Als dat zo is, wil ik het toevoegen of een nieuw anoniem object maken waaraan het is toegevoegd.
Maar omdat ik geen nieuw anoniem type kan maken door door de oude attributen te lopen en mijn eigen “id” -attribuut toe te voegen, zit ik een beetje vast.

Voor een container met een sterk getypte ID-eigenschap en vervolgens een anonieme getypte eigenschap ‘attributen’ zouden herschrijvingen van de code nodig zijn die niet opwegen tegen de vereiste ‘een id-veld toevoegen’.

Ik hoop dat deze reactie begrijpelijk is. Het is het einde van de dag, ik krijg mijn hersens niet meer op één lijn..

Other episodes