转换为类的泛型版本以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的强制转换崩溃了,我不明白为什么。

谢谢你的建议!

转换为类的泛型版本以InvalidCastException结束

如果您正在寻找类型为Model<T>的第一个对象,您可以将代码更改为

public static Model<T> GetCachedVersion<T>(this T cls) where T : class
{
    return CachedModels.OfType<T>.FirstOrDefault();
}

有许多事情你可能希望考虑。因为如果事情像你期望的那样,你的代码应该和这个没有什么不同。

1)将ClsTypeClsObjectT绑接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; }
    }
}

第一次猜测:

  1. 你是否有机会在你的代码中使用一个可空的类型,如模型?
  2. 查看ClsType设置是否正确。

看起来您必须创建一个通过反射创建泛型类型的Helper-Class。除了硬编码,没有其他方法可以向下转换

相关文章:
  • 没有找到相关文章