3

是否可以转换ExpandoObject为匿名类型的对象?

目前我有HtmlHelper可以将 HTML 属性作为参数的扩展。问题是我的扩展还需要添加一些 HTML 属性,所以我使用 ExpandoObject 合并我的属性和用户使用 htmlAttributes 参数传递给函数的属性。现在我需要将合并的 HTML 属性传递给原始 HtmlHelper 函数,当我发送 ExpandoObject 时,什么也没有发生。所以我想我需要将 ExpandoObject 转换为匿名类型的对象或类似的东西 - 欢迎任何建议。

4

2 回答 2

4

是否可以将 ExpandoObject 转换为匿名类型的对象?

仅当您在执行时自己生成匿名类型时。

匿名类型通常由编译器在编译时创建,并像任何其他类型一样烘焙到您的程序集中。它们在任何意义上都不是动态的。所以,你必须使用 CodeDOM 或类似的东西来生成用于匿名类型的相同类型的代码......这不会很有趣。

我认为其他人更有可能创建了一些了解ExpandoObject(或只能使用IDictionary<string, object>)的 MVC 助手类。

于 2012-10-04T14:05:27.857 回答
4

我不认为你需要处理 expandos 来实现你的目标:

public static class HtmlExtensions
{
    public static IHtmlString MyHelper(this HtmlHelper htmlHelper, object htmlAttributes)
    {
        var builder = new TagBuilder("div");

        // define the custom attributes. Of course this dictionary
        // could be dynamically built at runtime instead of statically
        // initialized as in my example:
        builder.MergeAttribute("data-myattribute1", "value1");
        builder.MergeAttribute("data-myattribute2", "value2");

        // now merge them with the user attributes 
        // (pass "true" if you want to overwrite existing attributes):
        builder.MergeAttributes(new RouteValueDictionary(htmlAttributes), false);

        builder.SetInnerText("hello world");

        return new HtmlString(builder.ToString());
    }
}

如果你想调用一些现有的助手,那么一个简单的 foreach 循环就可以完成这项工作:

public static class HtmlExtensions
{
    public static IHtmlString MyHelper(this HtmlHelper htmlHelper, object htmlAttributes)
    {
        // define the custom attributes. Of course this dictionary
        // could be dynamically built at runtime instead of statically
        // initialized as in my example:
        var myAttributes = new Dictionary<string, object>
        {
            { "data-myattribute1", "value1" },
            { "data-myattribute2", "value2" }
        };

        var attributes = new RouteValueDictionary(htmlAttributes);
        // now merge them with the user attributes
        foreach (var item in attributes)
        {
            // remove this test if you want to overwrite existing keys
            if (!myAttributes.ContainsKey(item.Key))
            {
                myAttributes[item.Key] = item.Value;
            }
        }
        return htmlHelper.ActionLink("click me", "someaction", null, myAttributes);
    }
}
于 2012-10-04T14:12:48.233 回答