Добавить свойство в анонимный тип после создания

Я использую анонимный объект для передачи моих атрибутов Html некоторым вспомогательным методам. Если потребитель не добавил атрибут ID, я хочу добавить его в свой вспомогательный метод.

Как я могу добавить атрибут к этому анонимному объекту?

93 голоса | спросил Boris Callens 24 +04002008-10-24T18:16:50+04:00312008bEurope/MoscowFri, 24 Oct 2008 18:16:50 +0400 2008, 18:16:50

4 ответа


0

Если вы пытаетесь расширить этот метод:

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

Хотя я уверен, что расширения объектов Khaja будут работать, вы можете получить более высокую производительность, создав RouteValueDictionary и передав объект routeValues, добавив дополнительные параметры из Context, а затем вернувшись, используя перегрузку ActionLink, которая принимает RouteValueDictionary вместо объект:

Это должно сработать:

    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);
    }
ответил Levitikon 20 J000000Wednesday11 2011, 00:40:46
0

Следующий класс расширения даст вам то, что вам нужно.

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;
    }
}
ответил Khaja Minhajuddin 11 SatEurope/Moscow2010-12-11T14:41:36+03:00Europe/Moscow12bEurope/MoscowSat, 11 Dec 2010 14:41:36 +0300 2010, 14:41:36
0

Я предполагаю, что вы имеете в виду анонимные типы, например, new { Name1=value1, Name2=value2} и т. д. Если это так, вам не повезло - анонимные типы - это обычные типы в том смысле, что они являются фиксированным, скомпилированным кодом. Они просто генерируются автоматически.

Что вы могли сделать, так это написать new { old.Name1, old.Name2, ID=myId }, но я не знаю, действительно ли вы этого хотите , Некоторые подробности ситуации (включая примеры кода) были бы идеальными.

Кроме того, вы можете создать контейнерный объект, у которого всегда есть идентификатор, и любой другой объект содержит остальные свойства.

ответил Jon Skeet 24 +04002008-10-24T18:19:55+04:00312008bEurope/MoscowFri, 24 Oct 2008 18:19:55 +0400 2008, 18:19:55
0
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}

Это примет значение идентификатора, которое должно иметь текстовое поле, и метка должна указывать. Если потребитель теперь не включает свойство «id» в textBoxHtmlAttributes, метод создаст неправильную метку.

Я могу проверить с помощью отражения, добавлен ли этот атрибут в объект labelHtmlAttributes. Если так, я хочу добавить это или создать новый анонимный объект, который добавил это. Но поскольку я не могу создать новый анонимный тип, пройдя по старым атрибутам и добавив свой собственный атрибут "id", я как бы застрял.

Контейнер со строго типизированным свойством ID, а затем анонимно типизированным свойством «атрибуты» потребует переписывания кода, который не соответствует требованию «добавить поле идентификатора».

Надеюсь, этот ответ понятен. Это конец дня, я больше не могу привести в порядок мои мозги ..

ответил Boris Callens 24 +04002008-10-24T18:37:38+04:00312008bEurope/MoscowFri, 24 Oct 2008 18:37:38 +0400 2008, 18:37:38

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132