c# - .net - 如何在c中的变量中存储泛型函数?

我有以下代码:


public interface IMenuItem


{


 IWebElement Parent { get; }


}





public class MenuItems


{


 public T GetMenuItem<T>() where T : IMenuItem, new()


 {


 var menuItem = new T();



 return menuItem;


 }


}





public abstract class Page : IEnumerable<IComponent>


{


 private Func<IMenuItem> _getMenuItems = new MenuItems().GetMenuItem<IMenuItem>;


}



我在试着把 new MenuItems().GetMenuItem<IMenuItem>_getMenuItems字段中的函数,但是由于这是一个泛型函数,所以这不起作用,如何将泛型函数存储到变量中?

new MenuItems().GetMenuItem<IMenuItem>不起作用,它告诉我:

'IMenuItem'must be a non-abstract type with a public parameterless constructor in order to use it as parameter'T'in the generic type or method'MenuItems.GetMenuItem()'

时间:

new()约束有问题。

若要使用新约束,类型不能是抽象的。

由于IMenuItem是一个接口,因此它不能被实例化

可以使用反射检索方法并调用它:


var method = typeof(MenuItems).GetMethod("GetMenuItem");


var instance = new MenuItems(); // Maybe convert the class into a static class??


var genericMethod = method.MakeGenericMethod(typeof(MenuItem1));


var result = genericMethod.Invoke(instance, null) as IMenuItem;



使用dynamic调用它:


dynamic instance = new MenuItems(); // Maybe convert the class into a static class??


var result = instance.GetMenuItem<MenuItem1>() as IMenuItem;



保留MenuItems的实例而不是方法本身:


var menuItems = new MenuItems();


var result = _instance.GetMenuItem<MenuItem1>() as IMenuItem;



最好的方法是包装方法:


public abstract class Page : IEnumerable<IComponent>


{


 private static readonly MenuItems menuItems = new MenuItems(); 



 protected Func<T> GetMenuItems<T>() where T : IMenuItem, new()


 {


 return () => menuItems.GetMenuItem<T>();


 }



}



这是对泛型参数t的约束,它必须是一个类(引用类型),并且必须有一个无公共参数的默认构造函数。

这意味着T不能是int,float,double,DateTime或其他结构(值类型)。

因此,你可以使用当前结构:


public interface IMenuItem


{


 IWebElement Parent { get; }


}



public class MenuItem : IMenuItem


{


 public IWebElement Parent => throw new NotImplementedException();


}



public class MenuItems


{


 public T GetMenuItem<T>() where T : IMenuItem, new()


 {


 var menuItem = new T();



 return menuItem;


 }


}


public abstract class Page : IEnumerable<IComponent>


{


 private Func<IMenuItem> _getMenuItems = new MenuItems().GetMenuItem<MenuItem>;


}



正如你的错误所说,你需要一个具体的类来传递给GetMenuItem方法。

...