107

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

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

4

4 に答える 4

81

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

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;
    }
}
于 2010-12-11T11:41:36.520 に答える
55

ここでは、たとえば匿名型を意味していると思いますnew { Name1=value1, Name2=value2}。そうであれば、運が悪いです。匿名型は、修正されたコンパイル済みコードであるという点で通常の型です。たまたま自動生成されるだけです。

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

別の方法として、常にID を持ち、その他のオブジェクトに残りのプロパティが含まれるコンテナー オブジェクトを作成することもできます。

于 2008-10-24T14:19:55.873 に答える
18

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

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);
    }
于 2011-07-19T20:40:46.717 に答える
-1
public static string TextBox(this HtmlHelper html, string value, string labelText, string textBoxId, object textBoxHtmlAttributes, object labelHtmlAttributes){}

これは、テキストボックスが持つべき id 値を受け入れ、ラベルが参照する必要があります。コンシューマーが textBoxHtmlAttributes に「id」プロパティを含めない場合、メソッドは正しくないラベルを作成します。

この属性が labelHtmlAttributes オブジェクトに追加されているかどうかをリフレクションで確認できます。もしそうなら、それを追加するか、それを追加した新しい匿名オブジェクトを作成したいと思います。しかし、古い属性を調べて独自の「id」属性を追加しても、新しい匿名型を作成できないため、行き詰まっています。

厳密に型指定された ID プロパティと匿名の型指定された「属性」プロパティを持つコンテナーでは、「id フィールドを追加する」要件に重きを置かないコードの書き直しが必要になります。

この回答が理解できることを願っています。一日の終わりだ、もう頭が整理できない..

于 2008-10-24T14:37:38.397 に答える