web-dev-qa-db-ja.com

作成後にプロパティを匿名型に追加します

匿名オブジェクトを使用して、Html属性をいくつかのヘルパーメソッドに渡します。消費者がID属性を追加しなかった場合、ヘルパーメソッドに追加します。

この匿名オブジェクトに属性を追加するにはどうすればよいですか?

98
Boris Callens

このメソッドを拡張しようとしている場合:

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues);

Khajaのオブジェクト拡張機能が機能すると確信していますが、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);
    }
14
Levitikon

次の拡張クラスは必要なものを取得します。

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

ここでは、匿名型を意味すると仮定します。 new { Name1=value1, Name2=value2}など。もしそうなら、あなたは運が悪い-匿名型は修正され、コンパイルされたコードであるという点で通常の型です。それらはたまたま自動生成されます。

could do you write new { old.Name1, old.Name2, ID=myId }しかし、それが本当にあなたが望むものかどうかはわかりません。状況に関するいくつかの詳細(コードサンプルを含む)が理想的です。

あるいは、alwaysにIDがあり、その他のオブジェクトに残りのプロパティが含まれるコンテナオブジェクトを作成できます。

47
Jon Skeet