Usando genéricos para criar métodos de extensão HtmlHelper

Eu realmente não estou familiarizado com a criação de métodos genéricos, então pensei em colocar essa pergunta na comunidade e ver o que volta. Pode até não ser um uso válido de genéricos!

Gostaria de criar um método de extensão HtmlHelper, onde posso especificar que o método é de um determinado tipo. Passo ao método uma instância desse tipo e uma instância de um objeto TagBuilder. Em seguida, especifico o atributo de classe da marca como o tipo de objeto que eu passei, com todas as propriedades do objeto serializadas nos atributos da marca.

editar... o benefício disso seria que eu poderia serializar facilmente meus elementos HTML em objetos javascript para jQuerying no servidor e na Model Binding, bem como a capacidade de especificar o estilo para um tipo... finalizar edição

Este exemplo de código pode esclarecer.

Eu tenho um tipo como este:

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;
    }
}

O que estou pensando é produzir um método auxiliar, talvez com uma assinatura semelhante a esta:

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.
}

Idealmente, eu poderia ligar para:

<% var myType = new MyType(123, 234); %>
<% var tag = new TagBuilder("div"); %>
<%= Html.GetTag<MyType>(myType, tag) %>

e o html produzido seria

<div class="MyType" prop1="123" prop2="234" />

E mais tarde, eu posso ligar

<%= Html.GetTag<MyOtherType>(myOtherType, tag) %>

para obter

<div class="MyOtherType" prop1="123" prop2="234" />

Isso é possível? Ou estou vendo isso totalmente da maneira errada? Alguém quer me informar sobre uma abordagem melhor?

obrigado

Dave

questionAnswers(2)

yourAnswerToTheQuestion