Как создать универсальный метод и создать экземпляр типа - PullRequest
1 голос
/ 16 марта 2010

Я хочу создать вспомогательный метод, который, как я могу себе представить, имеет сигнатуру, подобную этой:

public static MyHtmlTag GenerateTag<T>(this HtmlHelper htmlHelper, object obj)
{
    // how do I create an instance of MyAnchor? 
    // this returns MyAnchor, which has a MyHtmlTag base
}

Когда я вызываю метод, я хочу указать тип MyHtmlTag, например, MyAnchor, например ::100100

<%= Html.GenerateTag<MyAnchor>(obj) %>

или

<%= Html.GenerateTag<MySpan>(obj) %>

Может кто-нибудь показать мне, как создать этот метод?

Кроме того, что связано с созданием экземпляра указанного мной типа? Activator.CreateInstance()

Спасибо

Dave

Ответы [ 3 ]

2 голосов
/ 16 марта 2010

Вы бы использовали Activator.CreateInstance<T>:

public static MyHtmlTag GenerateTag<T>(this HtmlHelper htmlHelper, object obj)
{
    T value = Activator.CreateInstance<T>();
    // Set properties on value/ use it/etc
    return value;
}
1 голос
/ 16 марта 2010

В MvcContrib есть функциональные возможности, которые вы можете использовать под названием " FluentHtml ". Это выглядит так:

<%=this.TextBox(x => x.FirstName).Class("required").Label("First Name:")%>
<%=this.Select(x => x.ClientId).Options((SelectList)ViewData["clients"]).Label("Client:")%>
<%=this.MultiSelect(x => x.UserId).Options(ViewModel.Users)%>
<%=this.CheckBox("enabled").LabelAfter("Enabled").Title("Click to enable.").Styles(vertical_align => "middle")%>
0 голосов
/ 16 марта 2010

Вам нужно добавить общее ограничение для new () в T, а затем сделать следующее:

public static MyHtmlTag GenerateTag<T> (this HtmlHelper helper, T obj) where T : MyHtmlTag, new()
{
    T val = new T ();
    return val;
}
...