0

私はいくつかのコードを持っているいくつかのクラスを持っています

public IEnumerable<TypeOne> TypeOne
    {
        get
        {
            if (db != null)
            {
                var col = db.Select<TypeOne>();
                if (col.Count > 0) return col;
            }
            return db2.TypeOne;
        }
    }
    public IEnumerable<TypeTwo> TypeTwo
    {
        get
        {
            if (db != null)
            {
                var col = db.Select<TypeTwo>();
                if (col.Count > 0) return col;
            }
            return db2.TypeTwo;
        }
    }

ご覧のとおり、重複したコードがたくさんあり、列挙可能な同じプロパティ名とアイテムタイプがあります。「obj.MyProp」のようなオブジェクトのプロパティを呼び出したい。また、MyPropは、実行時にジェネリックまたは非ジェネリックメソッドを使用して解決する必要があります。出来ますか?

4

3 に答える 3

3

少し不完全な答えですが、一般的な考え方がわかります。

これは、ジェネリックが必要なシナリオです。

public IEnumerable<t> TypeSomething
{
    get
    {
        if (db != null)
        {
            t col = db.Select<t>();
            if (col.Count > 0) return col;
        }
        return GetDB<t>();
    }
}

任意のタイプに適切なdbを返すには、GetDB()を実装する必要がありますが、それは単一のスイッチになります(または、リフレクションを使用してそれを見つけることができます)

于 2012-10-09T15:23:43.577 に答える
0

ジェネリックを使用してこれを解決できます。

public IEnumerable<TypeOne> TypeOne
{
    get { return GetTable<TypeOne>(); }
}

public IEnumerable<TypeTwo> TypeTwo
{
    get { return GetTable<TypeTwo>(); }
}

private IEnumerable<T> GetTable<T>()
{
    if (db != null)
    {
        var col = db.Select<T>();
        if (col.Count > 0) return col;
    }

    return db2.Select<T>();    
}
于 2012-10-09T15:24:50.680 に答える
0

これを行うにはいくつかの方法があります。最良の方法は、おそらく一般的な方法です。

public IEnumerable<T> dbSelect<T>() //may need type constraints here
{
    return db != null
           ? db.Select<T>()
           : null;
}
public IEnumerable<TypeOne> TypeOne
{
    get { return dbSelect<TypeOne> ?? db2.TypeOne; }
}
public IEnumerable<TypeTwo> TypeTwo
{
    get { return dbSelect<TypeTwo>() ?? db2.TypeTwo; }
}

db2オブジェクトにジェネリックSelect<T>型のメソッドがある場合dbは、さらに簡単です。

public IEnumerable<T> dbSelect<T>()
{
    return db != null
           ? db.Select<T>()
           : db2.Select<T>(); //or db2.GetEntities<T>() or db2.OfType<T> or whatever
}

//Later, in your main code...
var x = dbSelect<TypeOne>();
var y = dbSelect<TypeTwo>();

これはタイプ セーフであり、リフレクションよりもかなり高速であり、Intellisense で動作します。

于 2012-10-09T15:26:47.933 に答える