我使用匿名对象将我的Html属性传递给一些辅助方法.如果消费者没有添加ID属性,我想在我的帮助方法中添加它.
如何向此匿名对象添加属性?
以下扩展类将为您提供所需的内容.
public static class ObjectExtensions { public static IDictionaryAddProperty(this object obj, string name, object value) { var dictionary = obj.ToDictionary(); dictionary.Add(name, value); return dictionary; } // helper public static IDictionary ToDictionary(this object obj) { IDictionary result = new Dictionary (); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj); foreach (PropertyDescriptor property in properties){ result.Add(property.Name, property.GetValue(obj)); } return result; } }
我假设你的意思是匿名类型,例如new { Name1=value1, Name2=value2}
等等.如果是这样,你运气不好 - 匿名类型是正常类型,因为它们是固定的,编译代码.它们恰好是自动生成的.
你可以做的是写new { old.Name1, old.Name2, ID=myId }
,但我不知道这是否是你想要的真的是.有关情况的更多细节(包括代码示例)将是理想的.
或者,您可以创建一个始终具有ID 的容器对象,以及包含其余属性的任何其他对象.
如果您尝试扩展此方法:
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); }