2010-03-15 3 views
1

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

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, например:

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

или

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

Может кто-то показать мне, как созд съел этот метод?

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

Благодаря

Dave

ответ

2

Вы бы использовать 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; 
} 
+0

Интересно. Использует ли Activator.CreateInstance удаление необходимости() общего типа ограничения? Это хорошо? – spender

+0

См. Http://msdn.microsoft.com/en-us/library/0hcyx2kd.aspx Вызов CreateInstance () завершится с * исключением *, если нет конструктора без параметров. Пример, который я опубликовал, не будет выполнен в * время компиляции * с полезной ошибкой в ​​отношении типа, переданного в общий метод, не имеющего конструктора без параметров. Вы берете свой выбор, для которого «лучше». – Pete

1

Там в существующие функциональные возможности в 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

Хм .. Я не знал, что это было. Мне нравится делать это сам. Я мог бы взглянуть на это, хотя если мои вещи окажутся неадекватными. – DaveDev

0

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

public static MyHtmlTag GenerateTag<T> (this HtmlHelper helper, T obj) where T : MyHtmlTag, new() 
{ 
    T val = new T(); 
    return val; 
} 
Смежные вопросы