0
public class Table<T> where T:SomeClassWithIntegerID
{
    private Dictionary<int, T> map = new Dictionary<int, T>();

    public bool isInMemory(int id)
    {
        if (map.ContainsKey(id))
            return true;
        return false;
    }

    public T setIt(T obj)
    {
        map[obj.id] = obj;
    }

    public T getIt(int id)
    {
        return map[id];
    }
}

例:

private static Table<User> table = new Table<User>;

class User : SomeClassWithIntegerID
{
    public string name { get; set; }
    public string password { get; set; }
}

class SomeClassWithIntegerID
{
    public int id { get; set; }
}

これで、特定のIDを持つユーザーを保持しているかどうかを確認できます。これは、それをキーとして使用しているためですが、保持がボブなどで保持Tableされているかどうかを確認する方法がありません。私は次のようなことができるようになりたいのですが、ジェネリック型でそれはどのように可能ですか?TableUsernametable.isInMemory(name, "bob")

エンドユーザーがフィールドとそのフィールドの期待値を指定できる関数を作成する必要があります。その後、Tableは、ディクショナリに格納されているそのクラスのすべてのオブジェクトを調べて、その値に一致するフィールドがあるかどうかを確認します。 。

これは可能ですか?

4

2 に答える 2

3
public bool IsInMemory(Func<T, bool> predicate)
{
    return map.Values.Any(predicate);
}

その後、次のように呼び出すことができます。

table.IsInMemory(u => u.Name == "bob");

一致するプロパティ名と値を使用する場合は、オーバーロードを追加できます。

public bool IsInMemory(string propertyName, object value)
{
    PropertyInfo property = typeof(T).GetProperty(propertyName);
    if(property == null) throw new ArgumentException("Invalid property name: " + propertyName);

    var predicate = new Func<T, bool>(item => object.Equals(value, property.GetValue(item, null)));
    return IsInMemory(predicate);
}
于 2012-10-03T17:22:21.207 に答える
2

Leeの答えをWhere-methodで補完して、LINQを使用したクエリを有効にします。

public IEnumerable<T> Where(Func<T, bool> predicate)
{
    return map.Values.Where(predicate);
}

そして例:

table.Where(x => x.name.Contains("natli"))
     .OrderBy(x => x.name);

実際の質問に答えるには、(.NET 4.0を使用している場合)動的型を使用して、実行時にすべてのメソッドなどを解決し、コンパイラがコンテキストから認識していないメソッドまたはプロパティを呼び出すことができます。

dynamic dynObject = someObject;
dynObject.SomeMethod("Hi there", 27); // Call whatever method or property you "know" exist
于 2012-10-03T17:34:48.823 に答える