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

时间:2012-11-04 05:40:20

标签: 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 ) );

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

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

        }
        return true;
    }
}

2 个答案:

答案 0 :(得分:5)

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

现在我认为你正在寻找的是一个约束,也就是说所有T总是属于某种基本类型。例如,如果所有T都是Form s,您可以对方法设置约束,然后访问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 fT ff的转换,因为它无效。

答案 1 :(得分:1)

如果T具有某种公共基类(公共类型),则使用泛型约束,以便编译器知道至少T将支持公共类上的方法。 http://msdn.microsoft.com/en-us/library/d5x73970.aspx