我正在尝试在列表中缓存一些类。
因为这个类有一个泛型属性,所以我创建了一个类的非泛型类型,它是这个列表的类型。
所以我的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的转换崩溃了,我不明白为什么。
感谢您的任何提示!
答案 0 :(得分:0)
第一次猜测:
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)将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; }
}
}