C# 使用泛型创建HtmlHelper扩展方法

C# 使用泛型创建HtmlHelper扩展方法,c#,asp.net-mvc,extension-methods,html-helper,C#,Asp.net Mvc,Extension Methods,Html Helper,我不太熟悉创建泛型方法,所以我想我应该向社区提出这个问题&看看会有什么结果。它甚至可能不是泛型的有效用法 我想创建一个HtmlHelper扩展方法,在这里我可以指定该方法属于某种类型。我将该类型的实例和TagBuilder对象的实例传递给该方法。然后,我将标记的class属性指定为我传入的对象的类型,并将对象的所有属性序列化为标记的属性 编辑… 这样做的好处是,我可以轻松地将中的Html元素序列化为javascript对象,以便jquery到服务器和模型绑定,并能够为类型指定样式 …结束编辑 此

我不太熟悉创建泛型方法,所以我想我应该向社区提出这个问题&看看会有什么结果。它甚至可能不是泛型的有效用法

我想创建一个HtmlHelper扩展方法,在这里我可以指定该方法属于某种类型。我将该类型的实例和TagBuilder对象的实例传递给该方法。然后,我将标记的class属性指定为我传入的对象的类型,并将对象的所有属性序列化为标记的属性

编辑… 这样做的好处是,我可以轻松地将中的Html元素序列化为javascript对象,以便jquery到服务器和模型绑定,并能够为类型指定样式 …结束编辑

此代码示例可能会澄清这一点

我有这样一种类型:

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;
    }
}
我的想法是生成一个helper方法,可能有一个类似的签名:

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.
}
publicstaticstringgettag(这个htmlhelperh,objectmytype,TagBuilder标记)
{
//将myType转换为T/(即myType)
//使用反射获取MyType中的属性
//获取与属性对应的值
//使用属性构建标记的属性/值对。
}
理想情况下,我可以打电话:

<% 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" />

有可能吗?还是我完全错了?有人愿意告诉我一个更好的方法吗

谢谢


Dave

我认为仿制药并不完全是您在这里寻找的

相反,您可能希望采取两种不同的方法之一

  • 使您的所有类都从一个公共类派生出来,该类具有一个名为“Render”的虚拟方法或类似的方法。这样,您就可以调用classes render方法

  • 使所有类实现一个具有Render方法的接口

  • 你只要打电话:


    尽管每个类都必须实现自己的Render方法,但是您需要1。避免反思,2。在类的基础上完全控制输出是什么。

    我认为泛型并不完全是您想要的

    相反,您可能希望采取两种不同的方法之一

  • 使您的所有类都从一个公共类派生出来,该类具有一个名为“Render”的虚拟方法或类似的方法。这样,您就可以调用classes render方法

  • 使所有类实现一个具有Render方法的接口

  • 你只要打电话:


    尽管每个类都必须实现自己的Render方法,但是您需要1。避免反思,2。在类的基础上完全控制输出是什么。

    对于您试图做的事情,我认为使用泛型的主要好处是利用类型推断。如果您按照以下方式声明您的方法:

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

    对于您试图做的事情,我认为使用泛型的主要好处是利用类型推断。如果您按照以下方式声明您的方法:

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

    这是可能的,但除非您传入的类型具有有效的html属性,否则将生成无效的html。你确定要这样做吗?你能详细说明一下这个的目的吗?@Baddie,我编辑的意思是“这样做的好处是,我可以轻松地将我的Html元素序列化到javascript对象中,用于服务器和模型绑定的jQuery,以及为类型指定样式的能力”。我知道它是无效的Html,但在XHTML文档的上下文中(即它是XML的子集,因此是可扩展的),可以使用自定义属性吗?这是可能的,但除非您传入的类型具有有效的Html属性,否则这将生成无效的Html。你确定要这样做吗?你能详细说明一下这个的目的吗?@Baddie,我编辑的意思是“这样做的好处是,我可以轻松地将我的Html元素序列化到javascript对象中,用于服务器和模型绑定的jQuery,以及为类型指定样式的能力”。我知道它是无效的Html,但在XHTML文档的上下文中(即,它是XML的子集,因此是可扩展的),可以使用自定义属性吗?