2013-03-21 95 views
0

我有以下設置:無法將派生類型轉換爲基類型?

struct Item { } 

class Entry : List<Item> { } 
泛型類

,在那裏我通過Entry類型的參數,我試圖讓List<Item>.Count

我曾嘗試以下不已:

var c = typeof(T).GetProperty("Count").GetMethod.Invoke(X, new object[]{}); // x is the variable in the generic class of type T! 

我也嘗試

var c = (x as ICollection).Count; 
// throws Cannot cast '((Entry)X)' (which has an actual type of 'Entry') to 'System.Collections.Generic.List<Item>' 

現在我真的不知道如何讓伯爵:(

代碼泛型類:這個想法是有一個記錄特定起始值的字段,然後在已經改變的情況下給出反饋。

SyncField<T> 
{ 
    T O { get; private set; } 
    T V { get; private set; } 

    public bool HasChanged 
    { 
     get 
     { 
      if (V != null && O != null) 
      { 
       var func = typeof(T).GetProperty("Count"); 
       if (func != null) 
       { 
        var oc = func.GetMethod.Invoke(O, new object[] { }); 
        var vc = func.GetMethod.Invoke(V, new object[] { }); 
        return oc != vc; // here i am trying to simply do ICollection.Count != ICollection.Count 
       } 
      } 
      return O != null && !O.Equals(V); 
     } 
    } 

}

更新: 我解決這個:

public bool HasChanged 
{ 
    get { return return O != null && !O.Equals(V); } 
} 

爲什麼?因爲Equals()方法List<T>已經做了我需要告訴我,如果這些2是不同的:)

+3

爲什麼你首先使用反射?如果這個項目是一個'Entry'或者它的任何子類型,那麼你可以調用'Count'來完成。 – Servy 2013-03-21 17:49:13

+0

設計模式:贊成繼承類繼承的對象組合,爲什麼會從它中派生出來,而不是將列表作爲成員包含在內? – David 2013-03-21 17:50:45

+2

請顯示一個簡短但完整的示例來說明問題。 (然後按照建議考慮重新設計。) – 2013-03-21 17:51:52

回答

2

我假設你在做其他地方SyncField<Entity>

SyncField<T> 
{ 
    T O { get; private set; } 
    T V { get; private set; } 

    public bool HasChanged 
    { 
     get 
     { 
      if (V != null && O != null && O is ICollection) 
      { 
       return ((ICollection)O).Count != ((ICollection)V).Count; 
      } 
      else 
      { 
       return O != null && !O.Equals(V); 
      } 
     } 
    } 
} 
+0

你假設是正確的:)並且很有趣,這是有效的,因爲它不會與'作爲ICollection'一起工作。謝謝! – Nefarion 2013-03-21 19:20:21

+0

@Nefarion - 我很高興它有幫助。 '返回(O作爲ICollection).Count!=(V作爲ICollection).Count'對我來說很好。 – Bobson 2013-03-21 20:25:50

相關問題