小技巧 - 简化你的泛型API

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

原有设计:

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

protected static PropertyInfo<TProperty> RegisterProperty<TOwner, TProperty>(Expression<Func<TOwner, TProperty>> propertyLambdaExpression)

使用方法:

var codeProperty = RegisterProperty<User, string>(e => e.Code);

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

灵光一现:

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

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

public class PropertyRegister<TOwner>
{
    public static PropertyInfo<TProperty> Register<TProperty>(
        Expression<Func<TOwner, TProperty>> propertyLambdaExpression
        )
    {
        TOwner onwer;
        TProperty propery;
        //...
    }
}

这时,调用方法变为:

var codeProperty = PropertyRegister<PBS>.Register(e => e.Code);

这样好吗?

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

java每日一练(2017/9/3)

本期题目 (单选题)1、下列关于构造方法不正确的是:( ) A 类的构造方法和类同名 B 一个类可以有多个构造方法 C 在实例化对象时必须调用类的构造方法 D...

30770
来自专栏从流域到海域

JavaScript闭包详解

JavaScript闭包详解 闭包就是由函数创造的一个词法作用域,里面创建的变量被引用后,可以在这个词法环境之外自由使用(维基百科)。 闭包,官方对闭包...

21980
来自专栏静晴轩

59分钟学会正则表达式

推荐几个正则表达式编辑器 Debuggex PyRegex Regexper 正则表达式是一种查找以及字符串替换操作。正则表达式在文本编辑器中广泛使用,比如正则...

42560
来自专栏别先生

Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念。因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因...

37050
来自专栏互联网杂技

深入理解javascript原型和闭包(1)——一切都是对象

“一切都是对象”这句话的重点在于如何去理解“对象”这个概念。 ——当然,也不是所有的都是对象,值类型就不是对象。 首先咱们还是先看看javascript中一个常...

380160
来自专栏奔跑的蛙牛技术博客

java基本程序设计

保护对象实例域,提供黑盒的概念保护数据域的安全,体现了面向对象思想。数据>算法的思想

10320
来自专栏Deep learning进阶路

C++随记(五)---const 与 指针

C++随记(五)---const 与 指针 const 限定符它把一个对象转换成一个常量,const与define。两者都可以用来定义常量,但是const定...

18700
来自专栏企鹅号快讯

每周四更面试题:True+True=?

面试题:True + Ture == ? Python 的 “+” 号会根据操作对象数据类型的不同而进行重载,操作对象为数字类型时,它是算术运算符;操作对象为序...

20470
来自专栏Albert陈凯

scala 隐式详解(implicit关键字)

掌握implicit的用法是阅读Spark源码的基础,也是学习Scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用...

32690
来自专栏C/C++基础

C++不要在构造函数和析构函数中调用虚函数

虽然可以对虚函数进行实调用,但程序员编写虚函数的本意应该是实现动态联编。在构造函数中调用虚函数,函数的入口地址是在编译时静态确定的,并未实现虚调用。但是为什么在...

15120

扫码关注云+社区

领取腾讯云代金券