这是我的类定义:
public abstract class AbstractEntity : ...
public partial class AbstractContactEntity : AbstractEntity, ...
public sealed class EntityCollectionProxy<T> : IList<T>, System.Collections.IList where T : AbstractEntity
现在我从委托那里得到一个对象,我想转换它,但它没有像我期望的那样工作:
EntityCollectionProxy<AbstractContactEntity> obj = resolver.DynamicInvoke (this.entity);
var col = obj as EntityCollectionProxy<AbstractEntity>;
col
为空。
如果我尝试常规铸造,var col = (Entity...) obj)
,我会遇到例外。
我预计它会起作用,因为类型是一致的。 我错过了什么?
它们不是同一类型。这与
List<string>
和 List<int>
相同:它们也不能相互投射。 AbstractContactEntity
是 AbstractEntity
并不会改变这一点。
从EntityCollectionProxy<T>
中提取接口并使其成为协变也不起作用,因为您想要实现IList<T>
,这意味着您拥有T
类型的输入参数和返回值,这会阻止协变。
唯一可能的解决方案如下:
var tmp = (EntityCollectionProxy<AbstractContactEntity>)obj;
var col = tmp.Select(x => (AbstractEntity)x);
col
的类型为 IEnumerable<AbstractEntity>
。如果你想拥有一个EntityCollectionProxy<AbstractEntity>
,你需要创建一个新的:
var result = new EntityCollectionProxy<AbstractEntity>(col);
这假设您的
EntityCollectionProxy<T>
类有一个接受 IEnumerable<T>
的构造函数。resolver.DynamikInvoke
返回的实例不同。