【发布时间】:2019-12-10 11:38:52
【问题描述】:
我有以下代码:
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”必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法“MenuItems.GetMenuItem()”中的参数“T”
现在我有许多实现IMenuItem 的具体类型,我希望代表接受这些。我不想为每个实现IMenuItem 的具体类型创建一个单独的委托。相反,我有一个可以接受实现 IMenuItem 的具体类型的委托。
【问题讨论】:
-
您是否真的打算在每次调用委托时创建(并丢弃)一个新的
MenuItems实例?这似乎是设计的一个潜在问题。GetMenuItem应该是静态的,或者MenuItems实例本身应该在其他地方创建。 -
这行得通——除非,正如其他人所指出的,您确实需要将具体类型传递给
GetMenuItem,IMenuItem自己不会这样做。您可能希望将其留给MenuItems来确定类型(例如,将其设为MenuItems<T>),或者您希望将Func<IMenuItem>传递给it,而不是有一个new()约束,所以由调用者决定实例化什么以及如何实例化。 -
其实这是一个很好的问题,所以我是否正确理解您想要使用这个变量
_getMenuItems像这样:IMenuItem temp = _getMenuItems<MyTypeImplementingIMenuItem>()?你希望它作为一个变量而不是一个方法?=!因为一个方法只能是new MenuItems().GetMenuItem<IMenuItem>()调用的包装器?=! -
@MongZhu 没错!我不需要方法包装器我想像你说的那样在变量中执行此操作:
IMenuItem temp = _getMenuItems<MyTypeImplementingIMenuItem>() -
我想你是想写
private Func<IMenuItem> _getMenuItems = () => menuItems.GetMenuItem<IMenuItem>();
标签: c# .net generics asp.net-core .net-core