gpt4 book ai didi

c# - 使用 "as"关键字转换对象返回 null

转载 作者:行者123 更新时间:2023-11-30 19:47:26 24 4
gpt4 key购买 nike

这是我的类定义:

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> : 它们也不能相互转换。那AbstractContactEntityAbstractEntity不会改变这个。从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com