将通用对象施放回C#中的原始对象



我在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;
    }
}

由于它是一种通用方法,因此T实际上可以是任何类型,直到简单的object。编译器 - 以及IntelliSense引擎的同样 - 在运行时不知道T是什么。请注意,这当然是您想要的行为,这是您首先使用仿制药的原因。在这种情况下,使用静态键入,无法在反射之外访问T的成员。

现在,我相信您正在寻找的是一个约束,也就是说,所有的T S将始终始终属于某种基本类型。例如,如果所有T s都是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的转换,因为它无能为力。

如果t具有某种类型的公共基类(公共类型),请使用通用约束,以便编译器将最小t t支持公共类中的方法。http://msdn.microsoft.com/en-us/library/d5x73970.aspx

最新更新