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>();
    }
}

您需要实现 GetDB() 来为任何给定类型返回适当的数据库,但这将是一个单一的开关(或者您可以使用反射来找到它)

于 2012-10-09T15:23:43.577 回答
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 回答
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 回答