使用“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。
我希望它有效,因为类型是连贯的。 我错过了什么?
它们的类型不同。 它与List
和List
:它们也不能相互转换。 那个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
返回的实例不同。