2010-03-15 76 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) %> 

有人能告訴我如何CRE吃了這個方法?

另外,創建我指定的類型的實例涉及什麼? Activator.CreateInstance()

感謝

戴夫

回答

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 2010-03-15 23:44:01

+0

請參閱:http://msdn.microsoft.com/en-us/library/0hcyx2kd.aspx 如果沒有無參數的構造函數,那麼對CreateInstance ()的調用將失敗並返回* exception *。我發佈的例子在*編譯時會失敗,並且有一個有用的錯誤,關於傳入不具有無參數構造函數的泛型方法的類型。你選擇哪個「更好」。 – Pete 2010-03-16 00:16:00

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 2010-03-16 00:08:38

0

您需要的new()通用約束添加到T,然後執行以下操作:

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