我有一些类有一些代码
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。有可能吗?
答案 0 :(得分:3)
稍微不完整的答案,但你会得到一般的想法:
这是您想要泛型的场景。
public IEnumerable<t> TypeSomething
{
get
{
if (db != null)
{
t col = db.Select<t>();
if (col.Count > 0) return col;
}
return GetDB<t>();
}
}
您需要实现GetDB()以返回任何给定类型的相应数据库,但这只是一个开关(或者您可以使用反射来查找它)
答案 1 :(得分: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>();
}
答案 2 :(得分: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一起使用。