在C#中将通用对象转换回原始对象

tra*_*man 3 c# casting

我无法从通用转换回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 ) );
Run Code Online (Sandbox Code Playgroud)

如果我键入ff.和intellisense弹出一些方法和属性.

我怎么能在这里有一个变量,它暴露了ff的所有属性和方法

        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

lc.*_*lc. 5

由于它是一种通用方法,T因此可以是任何类型,简单到一个简单object.编译器 - 以及智能感知引擎 - 不知道什么T是运行时.请注意,这当然是您想要的行为,这也是您首先使用泛型的原因.在这种情况下,使用静态类型,无法访问T反射之外的成员.

现在我认为你正在寻找的是一个约束,也就是说所有的Ts 总是具有某种基本类型.例如,如果所有Ts都是Forms,则可以对方法设置约束,然后访问以下成员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!";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意我已经省略了你的转换T f,T ff因为它什么都不做.