我有以下代码:

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的具体类型,我希望委托(delegate)人接受这些类型。我不想为实现IMenuItem的每种具体类型都单独分配一个委托(delegate)。相反,我只有一个委托(delegate),可以接受实现IMenuItem的具体类型。

最佳答案

问题在于new()约束。



由于IMenuItem是接口(interface),因此无法实例化,因此new()约束将成为问题。

编辑:

您可以通过以下两种方法解决此问题:

  • 您可以使用反射来获取并调用该方法:
    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;
    
  • 关于c# - 如何在C#中的变量中存储泛型函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59266362/

    10-09 07:29