转换为通用版本的Class以InvalidCastException结尾

时间:2013-05-27 08:52:30

标签: c# class generics casting

我正在尝试在列表中缓存一些类。

因为这个类有一个泛型属性,所以我创建了一个类的非泛型类型,它是这个列表的类型。

所以我的BO看起来像这样:

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的转换崩溃了,我不明白为什么。

感谢您的任何提示!

3 个答案:

答案 0 :(得分:0)

第一次猜测:

  1. 您是否有可能在代码中的任何位置使用可空类型,例如Model?
  2. 查看您是否正确设置ClsType

答案 1 :(得分:0)

看起来您必须创建一个Helper-Class,它通过反射创建泛型Type。除了硬编码之外别无他法。

答案 2 :(得分:0)

如果您要查找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; }
    }
}