转换为类的泛型版本以InvalidCastException结束
本文关键字:InvalidCastException 结束 版本 泛型 转换 | 更新日期: 2023-09-27 18:15:23
我正在尝试在列表中缓存一些类。
因为这个类有一个泛型属性,所以我为这个类创建了一个非泛型类型,它是这个列表的类型。
所以我的BOs是这样的:
public class Model<T> : Model where T : class
{
public T Cls
{
get { return (T) ClsObject; }
set { ClsObject = value; }
}
}
public class Model
{
public List<ModelProperty> Properties { get; set; }
public string ModelName { get; set; }
public Type ClsType { get; set; }
public object ClsObject { get; set; }
}
这里是缓存类:
private static List<Model> CachedModels {get; set;}
public static Model<T> GetCachedVersion<T>(this T cls) where T : class
{
var ret = CachedModels.FirstOrDefault(x => x.ClsType == typeof(T));
return ret != null ? (Model<T>)ret : null;
}
但是GetCachedVersion-Method的强制转换崩溃了,我不明白为什么。
谢谢你的建议!
如果您正在寻找类型为Model<T>
的第一个对象,您可以将代码更改为
public static Model<T> GetCachedVersion<T>(this T cls) where T : class
{
return CachedModels.OfType<T>.FirstOrDefault();
}
有许多事情你可能希望考虑。因为如果事情像你期望的那样,你的代码应该和这个没有什么不同。
1)将ClsType
与ClsObject
或T
绑接2)删除ClsObject
的setter(或者对外部代码隐藏它),因为它违反了Cls
的不变量。你可以将Cls
属性设置为非T
public class Model {
public List<ModelProperty> Properties { get; set; }
public string ModelName { get; set; }
public virtual Type ClsType { get {
ClsObject.GetType();
} }
public object ClsObject { get; protected set; }
}
public class Model<T> : Model {
public override Type ClsType { get{
return typeof(T);
}}
public T Cls
{
get { return (T) ClsObject; }
set { ClsObject = value; }
}
}
第一次猜测:
- 你是否有机会在你的代码中使用一个可空的类型,如模型? 查看
ClsType
设置是否正确。看起来您必须创建一个通过反射创建泛型类型的Helper-Class。除了硬编码,没有其他方法可以向下转换