簡體   English   中英

使用泛型創建HtmlHelper擴展方法

[英]Using Generics to Create HtmlHelper Extension Methods

我對創建泛型方法並不十分熟悉,因此我想將這個問題提交給社區並看看會回來什么。 甚至可能不是有效使用泛型!

我想創建一個HtmlHelper擴展方法,在其中可以指定該方法為某種類型。 我將這種類型的實例和TagBuilder對象的實例傳遞給方法。 然后,我將標簽的class屬性指定為我傳入的對象的類型,並將所有對象的屬性序列化為標簽的屬性。

編輯...這樣做的好處是,我可以輕松地將Html元素序列化為javascript對象,以便將jQuerying到服務器和模型綁定,以及為類型指定樣式的能力...結束編輯

此代碼示例可能會闡明。

我有這樣的類型:

public class MyType
{
    public int Prop1 { get; set; }
    public int Prop2 { get; set; }

    public MyType(int val1, int val2)
    {
        this.Prop1 = val1;
        this.Prop2 = val2;
    }
}

我在想的是產生一個輔助方法,也許帶有類似於以下的簽名:

public static string GetTag<T>(this HtmlHelper h, object myType, TagBuilder tag)
{
    // cast myType to T //(i.e. MyType)
    // use reflection to get the properties in MyType
    // get values corresponding to the properties
    // build up tag's attribute/value pairs with properties.
}

理想情況下,我可以打電話給:

<% var myType = new MyType(123, 234); %>
<% var tag = new TagBuilder("div"); %>
<%= Html.GetTag<MyType>(myType, tag) %>

和產生的HTML將是

<div class="MyType" prop1="123" prop2="234" />

然后,我可以打電話

<%= Html.GetTag<MyOtherType>(myOtherType, tag) %>

要得到

<div class="MyOtherType" prop1="123" prop2="234" />

可能嗎? 還是我看這是完全錯誤的方式? 有人願意讓我采用更好的方法嗎?

謝謝

戴夫

對於您要嘗試執行的操作,我認為使用泛型的主要好處是可以利用類型推斷。 如果您聲明方法如下:

public static string GetTag<T>(this HtmlHelper h, T myObj, TagBuilder tag)

您不必在調用時指定類型參數,因為它將根據用法進行推斷(即,編譯器將看到第二個參數的類型為MyType ,因此它將猜測T == MyType)。

但是無論如何,您實際上並不需要指定類型:該方法可以在對象上調用GetType ,並以與使用typeof(T)相同的方式使用結果類型,因此泛型在這里並不是那么有用。

但是,無論如何,我仍然看到使用它們的一個原因:如果您有一個MySubType類型的對象,該對象繼承自MyType ,則可能只希望呈現MyType中定義的屬性:在這種情況下,您只需指定MyType作為類型參數,覆蓋類型推斷。

這是一個可能的實現:

public static string GetTag<T>(this HtmlHelper h, T myObj, TagBuilder tag)
{
    Type t = typeof(T);
    tag.Attributes.Add("class", t.Name);
    foreach (PropertyInfo prop in t.GetProperties())
    {
        object propValue = prop.GetValue(myObj, null);
        string stringValue = propValue != null ? propValue.ToString() : String.Empty;
        tag.Attributes.Add(prop.Name, stringValue);
    }
    return tag.ToString();
}

我在想泛型不完全是您在這里尋找的東西。

相反,您可能想采用兩種不同的方法之一

  1. 使所有類都繼承自一個通用類,該通用類具有一個稱為“ Render”或類似名稱的虛擬方法。 這樣,您可以只調用類render方法。

  2. 使所有類都實現具有Render方法的Interface。

您會打電話給您:

盡管每個類都必須實現自己的Render方法,但您還是應該1.避免反射,2.在類的基礎上完全控制輸出內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM