我已经编写了一个小型库,可以在c#(https://github.com/developer82/Poco.Sql)中从POCO对象生成SQL语句。
我有一个返回QueryBuilder实例的扩展方法。并且QueryBuilder拥有构建SQL语句的自己的方法 - 其中一个是Where - 所以我可以做这样的事情:
var sql = myUserObject.PocoSql().Select().Where<User>(u => u.UserId = 5);
我要问的是,我真的需要将类型T传递给where方法,因为我已经知道我正在使用什么对象。基本上,我会把它想象成写作的方式:
var sql = myUserObject.PocoSql().Select().Where(u => u.UserId = 5);
我可能完全不在这里,但认为值得问
答案 0 :(得分:0)
为此,您应该使QueryBuilder
类通用:
public class QueryBuilder<T>
{
private T _obj;
public QueryBuilder(T obj)
{
_obj = obj;
}
...
}
现在,当您开始在Fluent界面中链接方法时,将保留原始对象类型的上下文,您不再需要在每个方法上显式指定对象类型。
另外,请不要忘记更新您的PocoSql
扩展方法,这也是您的流畅界面启动的地方:
public static class PocoSqlExtensions
{
public static QueryBuilder<T> PocoSql<T>(this T obj)
{
return new QueryBuilder<T>(obj);
}
}
基本上,如果你想要强类型并且编译器能够在编译时推断出对象类型,那就忘掉System.Object
类型。
答案 1 :(得分:0)
您的QueryBuilder类必须是通用的。因此,您只能在实例上精确设置T类型。