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つが異なる場合に私に伝える必要があることをすでに実行しているため:)

4

1 に答える 1

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);
            }
        }
    }
}
于 2013-03-21T18:17:43.133 に答える