【问题标题】:C# How to cast a generic type to interface it implementsC#如何将泛型类型转换为它实现的接口
【发布时间】:2019-10-11 08:00:44
【问题描述】:

这可能是一个愚蠢的问题,但我找不到解决方案。

我有这个结构(为简洁起见):

namespace Test
{
    public interface IEntity
    { }

    public class BaseEntity : IEntity 
    { }

    public class OneEntity : BaseEntity
    { }

    public class Configuration<T> where T : IEntity 
    {

    }

    public class Service 
    {
        public Dictionary<string, Configuration<IEntity>> Configurations = new Dictionary<string, Configuration<IEntity>>();

        public void RegisterConfiguration(string name, Configuration<T> configuration) where T : IEntity
        {
            if(Configurations.ContainsKey(name))
                return;

            Configurations.Add(name, configuration); //Error: Unable to convert Configuration<T> to Configuration<IEntity>
        }
    }
}

我想我无法将泛型类型转换为接口,但我该如何实现呢?我可以将RegisterConfiguration 写为:
public void RegisterConfiguration(string name, Configuration&lt;IEntity&gt; configuration),但是当我用我的一个实体调用它时它会失败(即使它们都实现了IEntity)。

一定有一些我对泛型没有正确理解的东西,但我不知道是什么。

【问题讨论】:

  • 仅仅因为T1T2 这两种类型表现出特定的继承/实现关系,并不意味着由这两种类型参数化的单个泛型类型(G&lt;T1&gt;, G&lt;T2&gt;) 表现出 same 关系。 (除了协方差和反方差的一些例外)

标签: c# oop generics interface


【解决方案1】:

试试这样:

public class Service<T> where T : IEntity
{
  public Dictionary<string, Configuration<T>> Configurations = new Dictionary<string, Configuration<T>>();

  public void RegisterConfiguration(string name, Configuration<T> configuration)
  {
    if (Configurations.ContainsKey(name))
      return;

    Configurations.Add(name, configuration);
  }
}

【讨论】:

  • 这确实可行,但它使我的服务“依赖于类型”,我不希望这样。
【解决方案2】:

这应该可行:原因是您可以从模板转换为接口但不能反转,而且在类级别它应该知道模板定义

public class Service<T>  where T : IEntity
{
    public Dictionary<string, Configuration<T>> Configurations = new Dictionary<string, Configuration<T>>();

    public void RegisterConfiguration(string name, Configuration<T> configuration) 
    {
        if (Configurations.ContainsKey(name))
            return;

        Configurations.Add(name, configuration); //Error: Unable to convert Configuration<T> to Configuration<IEntity>
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2016-10-20
    • 2023-03-22
    相关资源
    最近更新 更多