c#从扩展方法调用的方法的T类型

时间:2015-02-22 17:51:11

标签: c# .net lambda

我已经编写了一个小型库,可以在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);

我可能完全不在这里,但认为值得问

2 个答案:

答案 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类型。