zoukankan      html  css  js  c++  java
  • 简化你的泛型API

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


    原有设计:

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

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

    使用方法:

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

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


    灵光一现:

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

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

    01 public class PropertyRegister<TOwner>
    02 {
    03     public static PropertyInfo<TProperty> Register<TProperty>(
    04         Expression<Func<TOwner, TProperty>> propertyLambdaExpression
    05         )
    06     {
    07         TOwner onwer;
    08         TProperty propery;
    09         //...
    10     }
    11 }

    这时,调用方法变为:

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

    这样好吗?

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

    最近在学ASP.NET MVC,画了一些图,和大伙分享下:


    Routing 组件

    image

    图1 独立的ASP.NET Routing组件


    MVC-Controller

    image

    图2 Controller结构

    image

    图3 Controller中可用的ActionResult


    MVC-View

    image

    图4 使用的抽象工厂模式的视图引擎

    image

    图5 视图模型


        在这里,我没有写出具体的内容,在园子里搜索一下会有很多。:)

        推荐一下这个系统,蛮清楚的:《从零开始学习ASP.NET MVC》。

  • 相关阅读:
    OpenCV人脸识别的原理 .
    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征
    Qt开发者关于QThread的咆哮——你们都用错了
    Qt 线程基础(QThread、QtConcurrent等)
    [saiku] 在 Tomcat 下部署 saiku
    [saiku] 免登陆进入管理后台
    [saiku] 简化/汉化/设置默认页
    [saiku] schema文件分析
    [saiku] 通过管理台配置用户、schema和数据源
    [saiku] 简介、下载、安装和教程
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1884915.html
Copyright © 2011-2022 走看看