107

我使用匿名对象将我的 Html 属性传递给一些辅助方法。如果消费者没有添加 ID 属性,我想在我的辅助方法中添加它。

如何向此匿名对象添加属性?

4

4 回答 4

81

以下扩展类将为您提供所需的东西。

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;
    }
}
于 2010-12-11T11:41:36.520 回答
55

我假设您在这里指的是匿名类型,例如new { Name1=value1, Name2=value2}等。如果是这样,那么您就不走运了-匿名类型是普通类型,因为它们是固定的编译代码。它们恰好是自动生成的。

能做的就是写new { old.Name1, old.Name2, ID=myId },但我不知道这是否真的是你想要的。有关情况的更多详细信息(包括代码示例)将是理想的。

或者,您可以创建一个始终具有 ID 的容器对象,以及包含其余属性的任何其他对象。

于 2008-10-24T14:19:55.873 回答
18

如果您尝试扩展此方法:

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

虽然我确信 Khaja 的对象扩展会起作用,但您可能会通过创建 RouteValueDictionary 并传入 routeValues 对象、从 Context 添加其他参数,然后使用采用 RouteValueDictionary 而不是对象的 ActionLink 重载返回来获得更好的性能:

这应该可以解决问题:

    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);
    }
于 2011-07-19T20:40:46.717 回答
-1
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}

这将接受文本框应具有的 id 值和标签应引用的值。如果消费者现在没有在 textBoxHtmlAttributes 中包含“id”属性,则该方法将创建一个不正确的标签。

如果这个属性被添加到 labelHtmlAttributes 对象中,我可以通过反射检查。如果是这样,我想添加它或创建一个新的匿名对象来添加它。但是因为我无法通过遍历旧属性并添加自己的“id”属性来创建新的匿名类型,所以我有点卡住了。

具有强类型 ID 属性和匿名类型“属性”属性的容器将需要不符合“添加 id 字段”要求的代码重写。

希望这个回答是可以理解的。这一天结束了,我不能再让我的大脑排成一行了。。

于 2008-10-24T14:37:38.397 回答