• 为项目中的工具函数提供另类的实现


    在项目开发过程中,经常会写一些工具类。这些类里面,其实什么具体业务也没有做,只是为一些逻辑和算法提供了一些实现。比如一些格式化字符串的操作,获取连接字符串的操作等等。为了让这些方法通用,能够非常方便的被调用到。往往会设计一些静态类,使用静态方法来实现。这种实现非常好,但是却比较麻烦。比如你设计了一个静态类叫做CommonFunctions,里面有很多静态类,其中有一个方法叫做DoSameThing经常被调用,于是每次你在调用的时候就需要这样写:

    CommonFunctions.DoSameThing()

    每次都要带上CommonFunctions这样的前缀,显得不是很整洁,书写起来也很麻烦。于是,在最初的时候我就想到了Java的静态导入,在Java中这种实现往往都会在文件最上方写上:

    import static packagename.CommonFunctions.DoSameThing;

    这样就可以省掉CommonFunctions这样冗余的前缀了。但是悲剧的是C#没有类似的静态导入机制,为了实现同样的东西,经过一段时间的思索,搜集了一些资料之后,终于发现,原来在.net framework 3.0 之后多了一种叫做类扩展的机制.

    于是为了实现类似静态导入的能力,需要这样写:

    namespace myNamespace
    
    {
    
        static class CommonFunctions
    
        {
    
             public static void DoSameThing(this Object obj)
    
             {
    
                 //do samething you want
    
             }
    
        }
    
    }

    然后在你需要使用到这个方法的地方使用这个命名空间就可以了。其中DoSameThing的参数列表中第一个参数为 this ClassName o, 意思是这个方法是要扩展ClassName这个类的,也就是说所有ClassName这个类的实例,以后就都有DoSameThing这个方法了,而在上例中,直接扩展了Object,因为在C#中所有的类都是直接或者间接继承自Object的,所有在使用该命名空间之后,所有的类就都有了该方法。调用的时候就只需要写:

    DoSameThing();

    就可以了。如果你设计的扩展方法有多个参数,直接将你的参数写到this ClassName obj 这个参数后面就可以了。例如,我有个方法的原型是这样的:

    public String OpsStr(String s1, String 2);

    为了把这个函数扩展到String类,使得以后所有的String对象都可以使用,于是就可以这样实现:

    namespace myNamepace
    
    {
    
          static class StringFunc
    
          {
    
               public String OpsStr(this String s, String s1, String s2)
    
               {
    
                 //do samethin you want
    
               }
    
          }
    
    }
    这是对String类的扩展,如果是为了设计工具函数的话,直接对Object类进行扩展是一个很不错的选择。
  • 相关阅读:
    转:验证日期的正则表达式比较全面地验证
    IIS应用地址池监控
    Net预编译 真的好用与否
    关键字检索,找到所有数据
    vue 文件上传自定义实现
    docker 基础(一)
    input表单中嵌入百度地图
    linux系统光盘开机自动挂载-配置本地yum源
    linux学习笔记基础篇(一)
    构建apache web 服务器
  • 原文地址:https://www.cnblogs.com/malloc/p/2383376.html
Copyright © 2020-2023  润新知