使用通用接口属性覆盖非泛型接口属性

时间:2011-07-07 00:16:27

标签: c# inheritance interface generics

我有两个接口,如下所示:

public interface IEntityViewModel<T> : IEntityViewModel where T : class, ICLEntity
{
    new T Entity { get; set; }
}

public interface IEntityViewModel
{        
    void LoadEntity(int primaryKey);
    bool? DialogResult { get; set; }
    ICLEntity Entity { get; set; }        
}

当我实现一个类时,如何确保该类上出现的Entity属性是通用T?这是一个示例类:

    public abstract class EntityConductor<T> : IEntityViewModel<T>
    where T : class, ICLEntity
    {
        public T Entity
        {
            get; set;
        }
    }

编译器要求我也添加IEntityViewModel实现,例如:

ICLEntity IEntityViewModel.Entity
    {
        get
        {
            return ActiveItem.Entity;
        }
        set
        {
            ActiveItem.Entity = value as T;
        }
    }

然后我在课堂上得到两个Entity属性,这不是我需要的。如果实现泛型接口,我需要将Entity属性设置为T类型,如果是非泛型,则需要为ICLEntity类型。

如何做到这一点?我错过了一些简单的事吗?我使用的是.NET 4.0,协方差可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我不认为这可以做到。你几乎已经拥有了所能做的最好的东西。

public abstract class EntityConductor<T> : IEntityViewModel<T>
    where T : class, ICLEntity
{
    public T Entity { get; set; }

    ICLEntity IEntityViewModel.Entity
    {
        get { return Entity; }
        set { Entity = (T)value; }
    }
}

这应确保在使用IEntityViewModel对象时可以使用强类型属性,但如果您只知道它是IEntityViewModel对象,那么您将使用弱类型属性。没有额外的存储要求,所以我没有看到这个问题。此构造反映了您的使用场景 - 您有一个对象,但在某些情况下,您可能没有允许使用强类型属性的类型信息。

作为旁注,如果参数类型错误,IEntityViewModel.Entity中的setter应抛出异常。