创建后将属性添加到匿名类型

时间:2008-10-24 14:16:50

标签: c# reflection anonymous-objects

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

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

4 个答案:

答案 0 :(得分:74)

以下扩展类可以满足您的需求。

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

答案 1 :(得分:45)

我认为你的意思是匿名类型,例如: new { Name1=value1, Name2=value2}等。如果是这样,你运气不好 - 匿名类型是正常类型,因为它们是固定的,编译的代码。它们恰好是自动生成的。

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

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

答案 2 :(得分:14)

如果您尝试扩展此方法:

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

虽然我确信Khaja的Object扩展可以工作,但是你可以通过创建一个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);
    }

答案 3 :(得分:-1)

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

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

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

具有强类型ID属性的容器,然后是匿名类型的“attributes”属性,需要重写“add a id field”要求的代码重写。

希望这种反应是可以理解的。这是一天的结束,不能让我的大脑排成一行..