2012-06-08 31 views
2

这类似于另一个话题我最近公布,但也许这可能是简单和清晰:C#上溯造型泛型类型接口

我要完成以下(或非常类似的东西)...

IManageableEntryDao<IManageableEntry> dao = new CompanyNameDao(); 

...有以下类:

public interface IManageableEntry { 
    string Name { get; set; } 
} 

public class CompanyName : IManageableEntry { 
    public string Name { get; set; } 
} 

public interface IManageableEntryDao<T> where T : IManageableEntry { 
} 

public class CompanyNameDao : IManageableEntryDao<CompanyName> { 
} 

如果我尝试做一个投as IManageableEntryDao<IManageableEntry>,我得到一个空。

+0

所以这不会在C#3.5中可行吗? –

+0

可悲的是,没有。至少,不直接。您必须找到解决方法,例如使'CompanyNameDao'继承于'IManageableEntryDao ';这是你的要求。 – univerio

+0

正确,那不太优雅,因为那么CompanyNameDao返回IManageableEntry对象而不是CompanyName对象。 –

回答

2

查看Variance in Generic Interfaces。将界面更改为IManageableEntryDao<out T>,它应该可以工作(除非界面以使其无效的方式使用界面)。

4

我相信你需要covariance这个工作。此功能仅在C#4.0中提供。你需要做什么:

public interface IManageableEntryDao<out T> where T : IManageableEntry { }