我使用匿名对象将我的Html属性传递给一些辅助方法。 如果消费者没有添加ID属性,我想在我的帮助方法中添加它。
如何向此匿名对象添加属性?
答案 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”要求的代码重写。
希望这种反应是可以理解的。这是一天的结束,不能让我的大脑排成一行..