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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
103
0
49 241
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

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

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

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

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

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

Что ж ... вы мог создаете новый тип (с CodeDOM и т. д.), Который содержит соответствующие свойства. Но код был бы чертовски уродливым. Могу ли я предложить, чтобы вместо того, чтобы брать объект и смотреть на свойства через отражение, вы использовали IDictionary <string, string> или что-то в этом роде? (Продолжение)

Jon Skeet 24.10.2008 19:03

Вы можете создать этот словарь с помощью вспомогательного метода, который выполняет все функции отражения - и, возможно, иметь метод-оболочку, который делает именно это, - но словарь звучит так, будто он ближе к тому, что вы действительно пытаетесь представить; Инициализаторы анонимных объектов просто синтаксически удобны.

Jon Skeet 24.10.2008 19:04

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

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

100% правильно. Несмотря на то, что обычно вы используете анонимные типы для атрибутов Html, на самом деле это IDictionary <string, object>, и поэтому вы можете легко добавлять / удалять из него.

Peter Munnings 20.01.2012 13:34
msdn.microsoft.com/en-us/library/… делает то же самое, но встроено в System.Web.Mvc.HtmlHelper.
Mir 18.12.2012 01:55

Почему ToDictionary является общедоступным, а не частным, нет смысла раскрывать этот метод?

Professor of programming 13.11.2015 20:32
Ответ принят как подходящий

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

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

Хотя я уверен, что расширения Object Khaja будут работать, вы можете повысить производительность, создав RouteValueDictionary и передав объект routeValues, добавив дополнительные параметры из контекста, а затем вернувшись с помощью перегрузки 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);
    }

Работает как шарм, это должен быть принятый ответ! Кстати: если вы до сих пор используете объектные перегрузки ActionLink (), вам нужно обернуть htmlAttributes с помощью HtmlHelper.AnonymousObjectToHtmlAttributes (htmlAttributes), чтобы вызвать правильную перегрузку!

D.R. 28.08.2013 14:10

Другие вопросы по теме