将T约束到公共属性

时间:2013-10-09 07:57:56

标签: c# generics type-constraints

我有以下内容:

public interface IEntity
{
    IEntityContent Data { get; set; }
}

public interface IEntityContent { }

public interface IThingService<T>
{
    void DoThing(T item);
}

public class BaseEntity<T> : IEntity
    where T : IEntityContent
{
   public abstract T Data { get; set; }
}

public class FooEntity : BaseEntity<FooContent>
{
    public override FooContent Data { get; set; }
}

public class FooContent : IEntityContent
{
    // Some properties
}

public class ThingService<T> : IThingService<T>
    where T : IEntity
{
    public void DoThing(T item)
    {
        Serializer.Instance.Serialize(item.Content);
    }
}

Serializer.Instance.Serialize的签名是:

string Serialize<T>(T from)

但我得到以下内容:

  

'BaseEntity&LT; T&GT;'没有实现接口成员'IEntity.Data'。 'BaseEntity&lt; T&gt; .Data'无法实现'IEntity.Data',因为它没有匹配的返回类型'IEntityContent'

这是为什么?就目前而言,我被迫创建了一堆几乎相同的强类型的IThingService实现 - 这是一个重复的重复 - 只是为了指定不同的类型参数,据我所知,应该是通用的。

这是否与BaseEntity中缺乏协方差有关?如何让ThingService<T>工作?

1 个答案:

答案 0 :(得分:1)

为什么不简单地拥有:

public interface IEntity<T>
{
    T Data { get; set; }
}

对于接口的实现必须匹配接口(因为您没有声明任何反对/协方差),包括返回类型(因此您的错误消息)