这是我的类定义:
public abstract class AbstractEntity : ...
public partial class AbstractContactEntity : AbstractEntity, ...
public sealed class EntityCollectionProxy<T> : IList<T>, System.Collections.IList
where T : AbstractEntity
现在我从委托(delegate)那里得到一个对象,我想转换它,但它并没有像我预期的那样工作。
var obj = resolver.DynamicInvoke (this.entity);
var col = obj as EntityCollectionProxy<AbstractEntity>;
obj
类型为 EntityCollectionProxy<AbstractContactEntity>
.
但是col
一片空白。
如果我尝试常规转换 (var col = (Entity...) obj
),我会遇到异常。
我希望它能工作,因为类型是连贯的。 我想念什么?
最佳答案
它们不是同一类型。与 List<string>
相同和 List<int>
: 它们也不能相互转换。那AbstractContactEntity
是 AbstractEntity
不会改变这个。
从 EntityCollectionProxy<T>
中提取接口(interface)并制作它covariant也不起作用,因为您想实现 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
返回的实例不同。 .
关于c# - 使用 "as"关键字转换对象返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6841985/