1

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

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

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

感谢您的任何提示!

4

3 回答 3

0

第一个猜测:

  1. 您是否有机会在代码中的任何地方使用可空类型,例如模型?
  2. 看看你是否设置ClsType正确。
于 2013-05-27T09:31:47.083 回答
0

看起来您必须创建一个通过反射创建通用类型的 Helper-Class。除了硬编码之外,没有其他方法可以降低它。

于 2013-05-27T09:33:15.863 回答
0

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

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

您可能希望考虑许多事情。因为如果事情如您所料,那么您的代码应该与此没有什么不同。

1) 将 绑定ClsTypeClsObjector T 2) 删除 setter(或以其他方式将其从外部代码中隐藏),ClsObject因为它违反了 的不变量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; }
    }
}
于 2013-05-27T09:45:29.393 回答