前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小技巧 - 简化你的泛型API

小技巧 - 简化你的泛型API

作者头像
用户1172223
发布2018-01-29 16:19:17
6720
发布2018-01-29 16:19:17
举报
文章被收录于专栏:哲学驱动设计哲学驱动设计

    以下,我使用一个实例,分享一下用于简化泛型API设计的小技巧,“如何在泛型方法调用时,过滤掉可以隐式推断出的泛型参数”:

原有设计:

    系统中原来有这样一个静态的泛型API:

代码语言:javascript
复制
protected static PropertyInfo<TProperty> RegisterProperty<TOwner, TProperty>(Expression<Func<TOwner, TProperty>> propertyLambdaExpression)

使用方法:

代码语言:javascript
复制
var codeProperty = RegisterProperty<User, string>(e => e.Code);

可以看到,该方法虽然可以从参数中隐式推断出 P 的具体类型,但是无法推断出 T 的具体类型,所以需要显式指定T的类型。 由于语法特性的问题,我们不能使用RegisterProperty<User>(e => e.Code)的方法来只传递一个泛型参数给API;导致在使用该方法时,不得不把所有的的泛型参数都显式指定,也就是上面的使用方法。

灵光一现:

    如何做到不传递第二个泛型参数呢?在N天之后,发现了以下这个方法可以简化传入的泛型参数:

为该泛型方法声明一个泛型类:

代码语言:javascript
复制
public class PropertyRegister<TOwner>
{
    public static PropertyInfo<TProperty> Register<TProperty>(
        Expression<Func<TOwner, TProperty>> propertyLambdaExpression
        )
    {
        TOwner onwer;
        TProperty propery;
        //...
    }
}
代码语言:javascript
复制

这时,调用方法变为:

代码语言:javascript
复制
var codeProperty = PropertyRegister<PBS>.Register(e => e.Code);

这样好吗?

    这个方法的好处在于简化泛型API的客户程序调用代码,只显式传入无法隐式推断的泛型参数,不再传入多余的泛型参数。     在这个例子中,只有两个泛型参数,可能您会觉得多此一举。不过当你的参数更多,而无法推断的参数只有一个时,这个方法就有发挥的地方了。 :)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010-11-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档