我有这个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'一样使用。
我该如何正常工作?
提前致谢。
答案 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
是方法的参数。