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反射之外的成员。

现在我相信您正在寻找的是一个约束,也就是说,所有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!";
        }
    }
}

请注意,我省略了从T fto的转换,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 回答