Question

Is it possible to convert ExpandoObject to anonymously typed object?

Currently I have HtmlHelper extension that can take HTML attributes as a parameter. The problem is that my extension also needs to add some HTML attributes so I've use ExpandoObject to merge my attributes and attributes that user passes to the function using htmlAttributes parameter. Now I need to pass merged HTML attributes to original HtmlHelper function, and when I send ExpandoObject, nothing happens. So I guess that I need to convert ExpandoObject to anonymously typed object or something similar - any suggestions are welcome.

Was it helpful?

Solution

I don't think that you need to deal with expandos to achieve your goal:

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

and if you wanted to call some of the existing helpers, then a simple foreach loop could do the job:

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

OTHER TIPS

Is it possible to convert ExpandoObject to anonymously typed object?

Only if you generate the anonymous type yourself at execution time.

Anonymous types are normally created by the compiler, at compile-time, and baked into your assembly like any other type. They're not dynamic in any sense. So, you'd have to use CodeDOM or something similar to generate the same kind of code that's used for anonymous type... that's not going to be fun.

I think it's rather more likely that someone else will have created some MVC helper classes which know about ExpandoObject (or can just work with IDictionary<string, object>).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top