【问题标题】:How to make a List of Generic Interfaces with Types如何制作具有类型的通用接口列表
【发布时间】:2018-12-18 12:46:02
【问题描述】:

这是我的代码。

public interface IScorecardRule { }
public interface IScorecardRule<T> : IScorecardRule 
{
    List<T> Extract();
}

public class AdminRule : IScorecardRule<AdminRepository>
{
    public List<AdminRepository> Extract()
    {
        return new List<AdminRepository>();
    }
}

public class AdminRepository
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

现在我想要的是创建一个IScorecardRule 接口列表并迭代实现它的每个规则。我计划根据要求在此处添加更多规则,每个规则都具有返回List&lt;T&gt; 的“提取”方法的差异实现。这里的问题是Extract方法不可访问。

var rules = new List<IScorecardRule>();
rules.Add(new AdminRule()); //Rule for Admin
//rules.Add(new DeveloperRule()); //Rule for Developer

foreach (var rule in rules)
{
     var myList = rule.Extract(); //Extract Method Not Accessible
     //--More Code here--//
}

我希望这是有道理的。让我知道我的逻辑是否有缺陷以及这种方法是否可行。谢谢!

【问题讨论】:

  • 你能解释一下你想得到什么吗?这段代码对我来说很奇怪。
  • 你有一个List&lt;IScorecardRule&gt;,一个实现了一个没有任何方法的接口的对象列表。因此,除了在System.Object 上定义的方法外,您不能对从所述列表中获得的项目调用任何方法。要么创建List&lt;IScorecardRule&lt;AdminRepository&gt;&gt;,要么更好地解释您要解决的问题。
  • 您可以尝试用这个替换您调用 Extract 方法的行吗? ((IScorecardRule)rule).Extract();
  • Extract 未在 IScorecardRule 中定义,这是您为 List 定义的类型...请记住,IScorecardRuleIScorecardRule&lt;T&gt; 不同。

标签: c# generics interface return-type


【解决方案1】:

问题出在第一行:

var rules = new List<IScorecardRule>();

您将列表声明为 IScorecardRule 而不是 IScorecardRule&lt;AdminRepository&gt;

由于提取方法不在IScorecardRule 接口中,因此无法看到。

【讨论】:

    【解决方案2】:

    我刚刚通过使用下面的代码设法解决了这个问题。解决方案虽然不是很好,但我将把这个留在这里。

    foreach (var rule in rules)
    {
        Type typeParameterType = rule.GetType();
        var instance = (dynamic)Activator.CreateInstance(typeParameterType);
        var myList = instance.Extract();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      相关资源
      最近更新 更多