[英]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();
}
我在想泛型不完全是您在这里寻找的东西。
相反,您可能想采用两种不同的方法之一
使所有类都继承自一个通用类,该通用类具有一个称为“ Render”或类似名称的虚拟方法。 这样,您可以只调用类render方法。
使所有类都实现具有Render方法的Interface。
您会打电话给您:
尽管每个类都必须实现自己的Render方法,但您还是应该1.避免反射,2.在类的基础上完全控制输出内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.