2013-05-27 59 views
1

我試圖在列表中緩存一些類。鑄造到通用版本的類在InvalidCastException中結束

因爲這個類有一個通用的屬性,我創建了一個非泛型的類,這是該列表的類型。

所以我的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法崩潰鑄造,我不明白爲什麼。

感謝您的任何提示!

+3

沒有什麼表示,每一個'Model'了''的T' ClsType'實際上是一個'模式'。我們不知道你是如何創建模型的......而且,'ClsType'甚至可以設置。有多種原因可能是錯誤的。 –

+2

「ret」的實際(運行時)類型是什麼? –

+0

感謝Jon的提示。我從模型中提取了一個接口,所以現在我的BO是Model :IModel和Model:IModel。仍然沒有工作... 和托馬斯:也謝謝。 ret是Model 的型號 - 該代碼部分工作正常。 – Richard

回答

0

如果您正在尋找類型的第一個對象Model<T>,你可以更改您的代碼

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

有許多的東西,你不妨考慮一下。因爲如果事情和你預期的一樣,那麼你的代碼應該與此無異。

1)扎ClsTypeClsObjectT 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; } 
    } 
} 
+0

謝謝,偉大的方法! – Richard

0

第一次猜測:

  1. 你是不是在你的代碼像模型中使用可空類型的任何地方的任何機會呢?
  2. 看看你是否正確設置ClsType
+0

謝謝Kaveh。 ret是正確的值,它是接近的問題。 – Richard

+0

對類有一個限制,所以類型參數總是指向類,而'Model '是一個類,它使得所有類型都成爲問題類 –

+0

我的錯誤;我沒有仔細閱讀。 –

0

它看起來像你將不得不創建一個幫助類,通過反射創建泛型類型。除了硬編碼以外,沒有其他方法可以降級。