c# - 使用'field'作为'type'

时间:2013-11-07 18:14:31

标签: c# generics types

我有这个UserControl:

public static Type typCreate;

LoadUserControl<T>()
{
   typCreate = typeof( T );
}

protected void ButtonCommand( object sender, CommandEventArgs e )
{
   x.Execute<typCreate>();
}

考虑到方法LoadUserControl是主要方法,而事件ButtonCommand是由UserControl上的按钮触发的,我试图在事件上调用此方法:

class x
{
   public static T Execute<T>() { ... }
}

VS给出的错误是typeCreate是'field'但是像'type'一样使用。

我该如何正常工作?

提前致谢。

4 个答案:

答案 0 :(得分:1)

您还必须使UserControl类通用,以便进行编译时检查。

class Subclass<T> : UserControl
{
     protected void ButtonCommand( object sender, CommandEventArgs e )
    {
        x.Execute<T>();
    }
}

您可以使用反射,但这会有丢失编译时检查的风险。

答案 1 :(得分:1)

无需反思

这是您实现该功能的方法。您可以使用lambda来存储泛型方法的类型信息,该lambda调用具有相同泛型参数的另一个方法。

    public class Test
    {
        public static Action loadedTypeAction;

        public void LoadUserControl<T>()
        {
            loadedTypeAction = Execute<T>;
        }

        public void Execute<T>()
        {
            // do stuff
            MessageBox.Show(typeof (T).Name);
        }

        public void DoAction()
        {
            if (loadedTypeAction != null)
            {
                loadedTypeAction();
            }
        }
    }

答案 2 :(得分:0)

using System.Reflection;

private static readonly MethodInfo x_Execute_T = typeof(x).GetMethod("Execute", BindingFlags.Public | BindingFlags.Static);
private static readonly MethodInfo BuildExecute_T = typeof(LoadUserControl).GetMethod("BuildExecute", BindingFlags.NonPublic | BindingFlags.Static);
private readonly Func<object> x_Execute;

public static Type typCreate;

public LoadUserControl(Type t)
{
    typCreate = t;
    x_Execute = (Func<object>)BuildExecute_T.MakeGenericMethod(t).Invoke(null, null);
}

private static Func<object> BuildExecute<T>()
{
    return () => ((Func<T>)Delegate.CreateDelegate(typeof(Func<T>), x_Execute_T.MakeGenericMethod(typeof(T))))();
}

protected void ButtonCommand( object sender, object e )
{
   x_Execute();
}

答案 3 :(得分:-1)

感谢所有答案。

我使用Reflection解决了这个问题。

typeof( x ).GetMethod( "Execute" ).MakeGenericMethod( typCreate ).Invoke( this, new object[] { 'PARAM' } );

其中PARAM是方法的参数。