创build后将属性添加到匿名types

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

我怎样才能给这个匿名对象添加一个属性?

如果你想扩展这个方法:

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

尽pipe我确信Khaja的对象扩展可以工作,但是通过创build一个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); } 

下面的扩展类会得到你所需要的。

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

我假设你的意思是匿名types,例如new { Name1=value1, Name2=value2}等等。如果是这样的话,那么运气不好 – 匿名types是正常types,因为它们是固定的,编译代码。 他们恰好是自动生成的。

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

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

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

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

如果此属性添加到labelHtmlAttributes对象中,我可以通过reflection来检查。 如果是这样,我想添加它或创build一个新的匿名对象,它已被添加。 但是因为我不能通过遍历旧属性并添加自己的“id”属性来创build一个新的匿名types,所以我被卡住了。

具有强typesID属性的容器然后是匿名types的“属性”属性将需要重写不符合“添加ID字段”要求的代码。

希望这个回应是可以理解的。 这是一天的结束,不能让我的大脑在线了。