0

私はまだジェネリックを「取得」していないようです...本質的に Page.LoadControl() を呼び出すユーザーコントロールをロードする一般的な関数が必要ですが、それを機能させようとすると上記のエラーが発生します。

コントロールをロードするために使用するコードのモックアップを次に示します。

MyControl Ctrl = MyUtilClass.LoadControl(Page, "MyControl");

そして MyUtilClass で:

internal static T LoadControl<T>(Page P, string ControlName)
{
    return (T)P.LoadControl(String.Format("~/{0}{1}.ascx", WebGlobals.cControlDir, ControlName));
}

私は明らかに何か間違ったことをしていますが、私の理解では、コンパイラは、この関数の結果を割り当てようとしている var の型を見て、結果をその型としてキャストできるということでした。

4

2 に答える 2

3

これにはジェネリックは必要ありません。メソッドを返すだけControlです:

internal static System.Web.UI.Control LoadControl(Page P, string ControlName)
{
    return P.LoadControl(String.Format("~/{0}{1}.ascx", WebGlobals.cControlDir,
                                                        ControlName));
}

このメソッドを静的クラスに配置すると、そこから拡張メソッドを作成できます。thisメソッドの最初のパラメーターの前に注意してください。

internal static System.Web.UI.Control LoadControl(this Page P, string ControlName)
{
    return P.LoadControl(String.Format("~/{0}{1}.ascx", WebGlobals.cControlDir, 
                                                        ControlName));
}

次のように呼び出すことができます。

var control = yourPage.LoadControl(controlName);

本当にMyControlインスタンスが必要な場合は、メソッドを次のように変更します。

internal static MyControl LoadControl(this Page P, string ControlName)
{
    return (MyControl)P.LoadControl(String.Format("~/{0}{1}.ascx", 
                                    WebGlobals.cControlDir, 
                                    ControlName));
}
于 2012-04-11T08:13:46.073 に答える
2

Controlジェネリック関数をs のみに制限する必要があると思います。そうしないTと、目的にはジェネリックすぎます。

internal static T LoadControl<T>(Page P, string ControlName)
    where T : System.Web.UI.Control
{
    ...
}

編集

あなたはこれを行うことができますが、 Daniel Hilgarth's answerの非一般的なアプローチよりも複雑になる価値があるかどうかはわかりません。

internal static void LoadControl<T>(Page P, 
                                     string ControlName
                                     out T control)
    where T : System.Web.UI.Control
{
    control = (T)P.LoadControl(
                   String.Format("~/{0}{1}.ascx",
                                    WebGlobals.cControlDir, 
                                    ControlName));
}

このように呼び出す

MyControl myControl;
LoadControl(page, "MyControl", myControl);
于 2012-04-11T08:11:31.140 に答える