如何实现接受匿名类型的C#扩展方法

时间:2012-06-30 09:38:25

标签: c# .net asp.net-mvc-3 extension-methods asp.net-mvc-4

在ASP.NET MVC中,有很多Helpers接受匿名类型作为参数并生成输入。

例如:

@Html.Action("Action", "Controler", new {routeVal1 = 1, routeVal2 = 2})

我的问题是如何实现我自己的接受匿名类型的扩展。我应该将它作为对象引用并使用反射还是有更优雅的解决方案?

2 个答案:

答案 0 :(得分:3)

您可以使用dynamic代替object

  

Visual C#2010引入了一种新的动态类型。类型是静态类型,但动态类型的对象绕过静态类型检查。在大多数情况下,它的功能类似于它具有类型对象。在编译时,假定键入为动态的元素支持任何操作。因此,您不必担心对象是从COM API,动态语言(如IronPython),HTML文档对象模型(DOM),反射还是程序中的其他位置获取其值。但是,如果代码无效,则会在运行时捕获错误。

答案 1 :(得分:1)

首先,我假设你正在为此扩展权利 @HTML对象 你需要做的是用

创建方法

RouteValueDictionary类

所以它变成了 public static mvchtmlstring Foo(string Action,string Controller,RouteValueDictionary values)

然后你有函数调用

        TagBuilder tb = new TagBuilder("D");
        tb.Attributes.Add();

所以整个事情变成

public static mvchtmlstring Foo(string taglabel, string url, RouteValueDictionary values)
{


            TagBuilder tb = new TagBuilder("a");
tb.Attrubutes.add("href",url);
tb.setInnerText(taglabel);
            tb.MergeAttributes(values);
return new MvcHtmlString(tb.toString());
}

然后电话是

@Html.Foo("Bar","Http://www.stackoverflow.com",new {Id="d", class="dd"})

BTW RouteValueDictionary继承自IDictionary,因此您的类也可以拥有该签名。