1

Webコントロールを作成するために使用している以下のメソッドがあります(今のところ、リテラルとパネルだけです)

private T CreateControl<T>(string s1, string s2, string m1)
    where T: WebControl , new()
{
    T ctrl = default(T);

   if (ctrl is Literal )
    {
       Literal l = new Literal();
       l.ID = s1 + "ltl" + s2;
       l.Text = s1 +  " " + s2;
       ctrl = (Literal)l;
    }
    else if (ctrl is Panel)
    {
        Panel p  = new Panel();
        p.ID = s1+ "pnl" + s2;
        p.CssClass = s1 + "graphs";
        p.Attributes.Add("responsefield", s2);
        p.Attributes.Add("metricid", m1);
        ctrl = (Panel)l;

    }
    else if (ctrl is CheckBox)

       return ctrl;
}

私はこれを次のように呼び出しています:

Literal lg = CreateControl<Literal>("emails", name.Name, name.MetricId.ToString() );

しかし、変換は次の場所で失敗しています:

ctrl = (Literal)l;
ctrl = (Panel)p;

エラー:

Cannot implicitly convert type 'System.Web.UI.WebControls.Panel' to 'T' 

誰かがこの変換を処理する方法をアドバイスできますか?

前もって感謝します...

4

1 に答える 1

2

このようなものを提案できます。

private T CreateControl<T>(string s1, string s2, string m1)
where T : System.Web.UI.Control,new()
{

    if (typeof(T) == typeof(Literal))
    {
        Literal l = new Literal();
        l.ID = s1 + "ltl" + s2;
        l.Text = s1 + " " + s2;
        return l as T;
    }
    else if (typeof(T) == typeof(Panel))
    {
        Panel p = new Panel();
        p.ID = s1 + "pnl" + s2;
        p.CssClass = s1 + "graphs";
        p.Attributes.Add("responsefield", s2);
        p.Attributes.Add("metricid", m1);
        return p as T;

    }
    else if (typeof(T) == typeof(CheckBox))
    {
        return new CheckBox() as T;
    }
    else
    {
        return new T();
    }
}

編集:@jblが提案したように、戦後にキャストする必要のない方法を変更しました。

Literal l = CreateControl<Literal>("something", "something", "something");
于 2013-09-11T07:19:01.490 に答える