使用“as”关键字转换对象将返回null

这是我的类定义:

public abstract class AbstractEntity : ... public partial class AbstractContactEntity : AbstractEntity, ... public sealed class EntityCollectionProxy : IList, System.Collections.IList where T : AbstractEntity 

现在我从委托中得到一个对象,我想要它,但它不能像我期望的那样工作。

 var obj = resolver.DynamicInvoke (this.entity); var col = obj as EntityCollectionProxy; 

obj的类型为EntityCollectionProxy

但是col是空的。 如果我尝试常规转换(var col = (Entity...) obj ),我会得到一个exception。

我希望它有效,因为类型是连贯的。 我错过了什么?

它们的类型不同。 它与ListList :它们也不能相互转换。 那个AbstractContactEntity是一个AbstractEntity不会改变这个。 从EntityCollectionProxy提取接口并使其协变也不起作用,因为您想要实现IList ,这意味着您有输入参数并返回类型T值,这会阻止协方差。

唯一可行的解​​决方案如下:

 var tmp = (EntityCollectionProxy)obj; var col = tmp.Select(x => (AbstractEntity)x); 

col的类型为IEnumerable 。 如果要拥有EntityCollectionProxy ,则需要创建一个新的:

 var result = new EntityCollectionProxy(col); 

这假设您的EntityCollectionProxy类具有接受IEnumerable的构造函数。
但请注意,这将是一个新实例,与resolver.DynamikInvoke返回的实例不同。