1

我有这个用户控件:

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 是一个“字段”,但用作“类型”。

我怎样才能正确地完成这项工作?

提前致谢。

4

4 回答 4

1

您还必须使您的UserControl类成为通用类以进行编译时检查。

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

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

于 2013-11-07T18:15:27.463 回答
1

无需反思

这就是实现该功能的方式。您可以通过使用调用具有相同泛型参数的另一个方法的 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();
            }
        }
    }
于 2013-11-07T18:29:31.383 回答
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();
}
于 2013-11-07T18:37:53.040 回答
-1

感谢所有的答案。

我使用反射解决了这个问题。

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

PARAM方法的参数在哪里。

于 2013-11-08T12:54:21.960 回答