C# 使用“";作为「;关键字返回空值
以下是我的课程定义:C# 使用“";作为「;关键字返回空值,c#,casting,C#,Casting,以下是我的课程定义: public abstract class AbstractEntity : ... public partial class AbstractContactEntity : AbstractEntity, ... public sealed class EntityCollectionProxy<T> : IList<T>, System.Collections.IList where T : AbstractEntity 公共抽象类Abstr
public abstract class AbstractEntity : ...
public partial class AbstractContactEntity : AbstractEntity, ...
public sealed class EntityCollectionProxy<T> : IList<T>, System.Collections.IList
where T : AbstractEntity
公共抽象类AbstractEntity:。。。
公共部分类AbstractContactEntity:AbstractEntity。。。
公共密封类EntityCollectionProxy:IList,System.Collections.IList
其中T:AbstractEntity
现在我从一个委托中得到一个对象,我想强制转换它,但它并没有像我期望的那样工作
var obj = resolver.DynamicInvoke (this.entity);
var col = obj as EntityCollectionProxy<AbstractEntity>;
var obj=resolver.DynamicInvoke(this.entity);
var col=obj作为EntityCollectionProxy;
obj
属于EntityCollectionProxy
类型
但是col
为空。
如果我尝试常规强制转换(var col=(Entity…)obj
),我会得到一个异常
我希望它能工作,因为类型是连贯的。
我错过了什么?它们不是相同的类型。这与
列表
和列表
相同:它们也不能相互转换。AbstractContactEntity
是一个AbstractEntity
不会改变这一点。
从EntityCollectionProxy
提取接口并使其运行也不起作用,因为您想要实现IList
,这意味着您有t
类型的输入参数和返回值,以防止协方差
唯一可行的解决方案是:
var tmp = (EntityCollectionProxy<AbstractContactEntity>)obj;
var col = tmp.Select(x => (AbstractEntity)x);
这假设您的EntityCollectionProxy
类有一个接受IEnumerable
的构造函数但请注意,这将是一个新实例,与解析程序返回的实例不同。DynamicInvoke您能找到一个与我的问题相同的问题吗?我的问题是我不知道泛型类型
t
,所以我不能像我说的那样执行它(obj as List)。选择(x=>(AbstractEntity)x)
但我想这不是最好的方法乔纳斯:我认为这也行不通。您可以执行以下操作:var col=(obj作为IEnumerable.Cast()代码>
var result = new EntityCollectionProxy<AbstractEntity>(col);