【问题标题】:Casting an object using the "as" keyword returns null使用“as”关键字转换对象返回 null
【发布时间】:2011-07-27 09:18:13
【问题描述】:

这是我的类定义:

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

现在我从一个委托人那里得到一个对象,我想强制转换它,但它并没有像我期望的那样工作。

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

obj 的类型为 EntityCollectionProxy&lt;AbstractContactEntity&gt;。

但col 为空。 如果我尝试常规转换 (var col = (Entity...) obj),我会遇到异常。

我希望它可以工作,因为类型是连贯的。 我错过了什么?

【问题讨论】:

  • 你能找到一个和我问的一样的问题吗?

标签: c# casting


【解决方案1】:

它们不是同一类型。与List&lt;string&gt; 和List&lt;int&gt; 相同:它们也不能相互转换。 AbstractContactEntity 是 AbstractEntity 不会改变这一点。 从EntityCollectionProxy&lt;T&gt; 中提取接口并将其设置为covariant 也不起作用,因为您要实现IList&lt;T&gt;,这意味着您有输入参数和T 类型的返回值,这会阻止协方差。

唯一可能的解决方案如下:

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

col 的类型为 IEnumerable&lt;AbstractEntity&gt;。如果你想拥有一个EntityCollectionProxy&lt;AbstractEntity&gt;,你需要创建一个新的:

var result = new EntityCollectionProxy<AbstractEntity>(col);

这假定您的 EntityCollectionProxy&lt;T&gt; 类有一个接受 IEnumerable&lt;T&gt; 的构造函数。
但请注意,这将是一个 NEW 实例,与 resolver.DynamikInvoke 返回的不同。

【讨论】:

  • 我的问题是我不知道泛型类型T,所以不能像我说的那样
  • 我做了(obj as List&lt;object&gt;).Select(x =&gt; (AbstractEntity) x),但我猜这不是最好的方法
  • Jonas:我认为这也行不通。您可以执行以下操作:var col = (obj as IEnumerable).Cast&lt;AbstractEntity&gt;();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 2010-10-04
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多