3

C#でジェネリックから元のオブジェクトにキャストするのに問題があります

private static bool OpenForm<T>( )
{
    List<T> list = FormManager.GetListOfOpenForms<T>();
    if ( list.Count == 0 )
    {
        // not opened
        return false;
    }
    else
    {
        // opened
        foreach ( T f in list )
        {
            T ff = ( T ) Convert.ChangeType( f, typeof( T ) );

ffと入力した場合。そして、インテリセンスがいくつかのメソッドとプロパティとともに表示されます。

ff のすべてのプロパティとメソッドを公開する変数をここに置くにはどうすればよいですか

        }
        return true;
    }
}
4

2 に答える 2

5

これはジェネリックメソッドであるため、T文字通り、単純なまでの任意のタイプにすることができobjectます。Tコンパイラー(および同様にインテリセンスエンジン)は、実行時まで何が何であるかを知りません。もちろん、これはあなたが望む振る舞いであり、そもそもジェネリックを使用する理由であることに注意してください。この場合、静的型付けを使用するとT、リフレクションの外部のメンバーにアクセスする方法はありません。

今、あなたが探していると私が信じているのは制約です。つまり、すべてTのsは常に特定の基本タイプになります。たとえば、すべてTのsがsになる場合は、メソッドに制約を設定してから、 :Formのメンバーにアクセスできます。Form

private static bool OpenForm<T>() where T : Form
{
    List<T> list = FormManager.GetListOfOpenForms<T>();
    if ( list.Count == 0 )
    {
        // not opened
        return false;
    }
    else
    {
        // opened
        foreach ( T f in list )
        {
            f.Text = "You found me!";
        }
    }
}

何もしないので、からT fへの変換を省略していることに注意してください。T ff

于 2012-11-04T05:48:04.603 に答える
1

Tにある種の共通基本クラス(共通型)がある場合は、ジェネリック制約を使用して、コンパイラーが少なくともTが共通クラスのメソッドをサポートすることを認識できるようにします。 http://msdn.microsoft.com/en-us/library/d5x73970.aspx

于 2012-11-04T05:49:04.307 に答える