【问题标题】:Make generic property in non generic class [duplicate]在非泛型类中创建泛型属性[重复]
【发布时间】:2017-04-04 03:28:50
【问题描述】:

我有一个像这样的抽象泛型类:

public abstract class ServicoAbstrato<TEntity, TId>
  where TEntity : EntidadeBasica<TId>
  where TId : IEquatable<TId>
{
    protected IDao<TEntity, TId> dao; ...
}

public abstract class EntidadeBasica<TId>
  where TId : IEquatable<TId>
{ ... }

我想在另一个类中拥有这个泛型类的属性,如下所示:

[AttributeUsage(AttributeTargets.Property | AttributeTargets .Field)]
public class ServicesAttribute : HandlerAttribute
{
    public ServicoAbstrato<EntidadeBasica<Type>, Type> servico { get; set; }

    public override ICallHandler CreateHandler(IUnityContainer container)
    {
        return new ServicesHandler(servico);
    }
}

但它给了我以下错误:

类型“System.Type”不能用作泛型类型或方法“Servico.ServicoAbstrato”中的类型参数“TId”。没有从“System.Type”到“System.IEquatable”的隐式引用转换

我该如何解决这个问题?

【问题讨论】:

  • 很简单,你有一个约束TId : IEquatable&lt;TId&gt;,而Type不是IEquatable&lt;Type&gt;
  • 就像在标记的副本中一样,您尝试用作泛型类型参数的类型没有实现您的泛型声明需要类型参数来实现的接口。

标签: c# generics


【解决方案1】:

您在定义了TId 的地方使用了Type。并且 TId 作为 where 子句中的限制,因此它必须是 IEquatable&lt;TId&gt; 类型。

Type(至少是您使用的Type)是 Microsoft 类,不满足该条件。

如果你有一个类Equatable&lt;T&gt; 实现了接口IEquatable&lt;T&gt;,你可以使用

public ServicoAbstrato<EntidadeBasica<Type>, Equatable<Type>> servico { get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2011-07-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    相关资源
    最近更新 更多