C# 接口开发小工具 笔记

做了2年的接口开发,主要给移动端提供接口,整理了一套小工具,在这里记录一下。

1.非空字段检测

 接口某些字段不能为空,最开始进行空值检测是在方法里面,一个参数一个参数手动的检测是否为空,某些方法非空字段十几个的时候,代码臃肿,看着恶心,写着也烦,于是就利用特性和反射实现了自动空值检测。

 //特性声明

[AttributeUsage(AttributeTargets.Property)]
    public class NotNull : Attribute
    {
    }

//使用方式

public class GetOrderListReq
    {
        [NotNull]
        public string uid { get; set; }
    }

//检测方法,CustomExp是我自定义的错误类

 public void NotNullCheck(object t)
        {
            var ps = t.GetType().GetProperties();
            foreach (var item in ps)
            {
                //var c = item.GetCustomAttributes(typeof(NotNull), false).FirstOrDefault(m => m.GetType().Name == "NotNull");
                var c = (NotNull)Attribute.GetCustomAttribute(item, typeof(NotNull));
                if (c != null)
                {
                    if (item.GetValue(t, null) == null)
                        throw new CustomExp(4, item.Name + "不能为空!");
                }
            }
        }

检测流程。提前约定所有方法的形参均为一个类对象,在调用方法前先把实参检测一遍,成功了再调用方法。

2.默认值设置

其实和非空检测大同小异,C#有提供一个DefaultValue特性,不过我习惯用自己的东西~

[AttributeUsage(AttributeTargets.Property)]
    public class MyDefaultValue : Attribute
    {
        //默认值
        public object Value { get; set; }
    }
 public class GetOrderListReq
    {
        [NotNull]
        public string uid { get; set; }
        [NotNull]
        public DateTime ltime { get; set; }
        [MyDefaultValue(Value = 1)]
        public int index { get; set; }
        [MyDefaultValue(Value = 10)]
        public int size { get; set; }
    }
 public void SetDefaultValue(object t)
        {
            var a = t.GetType().GetProperties();
            foreach (var item in a)
            {
                var deault = (MyDefaultValue)Attribute.GetCustomAttribute(item, typeof(MyDefaultValue));
                if (deault != null)
                {
                    item.SetValue(t, deault.Value, null);
                }
            }
        }

3.方法路由

接口方法可能成百上千,如果用if或switch判断调用哪个方法能写到人奔溃~所以我用反射写了个方法路由,速度肯定没if快,但是就算接口有1000个方法,遍历一遍也用不了多久,所以这点性能损失可以接受。类名+方法名确定唯一一个方法,arguments是方法实参对象的json字符串。返回值是一个类对象,视前端需要可以进行json序列化或xml序列化

public object GetEntry(string className, string MethodName, string arguments)
        {
            var ts = Assembly.GetExecutingAssembly().GetTypes();
            object response = "";

            bool notSuch = true;

            Type resType;
            Type reqType;

            foreach (var t in ts)
            {
                if (t.Name == className)
                {
                    //实例类对象
                    var objClass = Assembly.GetExecutingAssembly().CreateInstance(t.FullName);
                    //获取类里面的方法
                    MethodInfo m = t.GetMethod(MethodName);
                    if (m != null)
                    {
                        notSuch = false;
                        //获取请求及响应对象的类型
                        resType = m.ReturnType;
                        if (m.GetParameters().Count() > 0)
                        {
                            reqType = m.GetParameters()[0].ParameterType;
                            if (arguments == null)
                                throw new CustomExp(2, "该接口的参数不能为空!");
                        }
                        else
                        {
                            reqType = null;
                        }

                        //反序列化字符串参数,生成参数对象并放入参数队列
                        object[] arg = new object[1];
                        if (!string.IsNullOrEmpty(arguments) && reqType != null)
                        {
                            arg[0] = Json.JsonDes(arguments, reqType);
                        }
                        else
                            arg = null;

                        //执行方法并获取返回的对象并序列化为字符串
                        try
                        {
                            //参数不为空则进行非空检测及默认值设置
                            if (arg != null)
                            {
                                NotNullCheck(arg[0]);
                                SetDefaultValue(arg[0]);
                            }
                            response = m.Invoke(objClass, arg);
                            break;
                        }
                        catch (Exception E)
                        {
                            //获取内部传递的异常,因为invoke会自动增加一层调用方法错误异常
                            throw E.GetBaseException();
                        }
                    }
                }
            }
            if (notSuch)
                throw new CustomExp(3, "接口不存在!");
            return response;
        }
时间: 2024-10-19 10:09:40

C# 接口开发小工具 笔记的相关文章

<<< 日常辅助开发小工具

Notcpad++ Notepad++ 是一款非常有特色的编辑器,Notepad++是免费开源软件,内置支持多达 27 种语法高亮度显示 大小:7.3M FSCapture 无简介 大小:7.3M -------------------------------------------------------------------------------------------------------------------------------------------------------

Android 开发小工具之:Tools 属性 (转)

Android 开发小工具之:Tools 属性 http://blog.chengyunfeng.com/?p=755#ixzz4apLZhfmi 今天来介绍一些 Android 开发过程中比较有用但是大家又不常用的小工具.这些小工具可以提高 Android 应用开发的效率.还可以提高代码质量.所以还是有必要使用的. 首先介绍布局文件中的 tools 属性. 如果你用 Android Studio 创建一个简单的示例项目,在生成的布局文件中会有这么一行内容: xmlns:tools="http:

好用的前端开发小工具

这是一款集截屏(支持自定义尺寸).屏幕录影机.屏幕拾色器.屏幕放大镜.屏幕标尺.PDF图片转换.图片编辑等等诸多实用功能于一身的小工具, 完全免费,极限轻量化,软件总体积仅1.63 MB . 链接: https://pan.baidu.com/s/15Mii0BiLcD3Pr2_OXAkAWw 提取码: guqp 原文地址:https://www.cnblogs.com/lyyo/p/11491349.html

借开发小工具做工作感悟

近几个月,项目比较多,发现在开发自测的过程中比较麻烦,一句话就是反复重复,且效率也是一般的.感觉整个组都差不多的状态. 为了更高效的工作,开发一些小的工具.安逸这么久了,也该做些总结了. 工作总结: 毕业也快两年了,又是一次面临选择的时候来了.在目前的公司,生活很安逸,前一年工作不忙,后一年相对要忙一些,主要是自己独立负责了很多项目,而且还要写设计和开发,同时也要处理客户各种需求. 在一个成熟型的,传统型的大公司,最明显的一个特征就是技术相对旧一些,不过也是主流.稳定的技术.分工方面,也比较细.

xamarin开发的mac开发小工具集合

兄弟们我拖控件拖到了mac系统去了, 工具上传到百度网盘,下载地址 链接:https://pan.baidu.com/s/1Q64zoRjE3u66jJnzF8rhww提取码:ljx2 这款工具我是用微软的xamarin.mac技术开发的,驻留在menubar上如下图所示 Image是自动上传剪贴板的图片工具 Image是监听剪切板有没有复制图片,有的话自动把图片上传到服务器,并且生成一个 markdown的图片并且赋值到剪贴板,可以直接在写markdown的时候粘贴,是方便写markdwon插

javaWeb开发小工具---MailUtils及其单元测试

本次介绍的是,在javaWeb开发中,我们不免会遇到发送邮件的需求,比如:用户注册账号,需要激活登录,以及服务器定期向会员发送礼品信息等.所以参考有关资料,写了这个MailUtils工具类. 1.MailUtils的概述 这个MailUtils工具类底层使用了javax.mail包里面的API.所以我们要导入依赖的jar包----mail.jar和activation.jar两个jar包. 一封邮件基本由发件人.收件人.抄送人(可选).标题.正文.附件组成.这里我们要介绍的是邮件的发送. 在这个

Android 开发—— 小工具,大效率

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:姚志锋 一.Hugo插件 -- 打印方法运行时间 首先申明下,此Hugo非 彼Hugo(Hugo是由Go语言实现的静态网站生成器). Hugo插件作用 : 能够计算并打印一个方法的输入参数和函数的运行时间 Hugo插件应用场景: 处理Android 应用卡顿问题 (1)先看实例 1)在对应方法处标注@DebugLog SearchResultPanel::dispatchResult处标记@Debug

使用必应查询接口开发搜索工具:反查一个IP上的旁站

前言:必应提供了"Bing Search API",免费版的一个月可以查询5000次,我们可以通过调用这个API方便的使用必应的查询服务.其中"K8_C段旁注查询工具V2.0"就使用到了这个API,接下来我将详细说明在Java中如何使用这个API 一 API申请 申请地址:https://datamarket.azure.com/dataset/bing/search 当然首先要进行登陆,没有账号的话就注册一个,但是需要注意的是"国家/地区"这个

Android 程序猿之必备10种开发小工具

十一提前放“价”,北风网折上折,送豪礼 具体活动详情请点击:http://www.ibeifeng.com/online101.html 活动时间:2014.9.24-2014.9.25 Android SDK 本身包含很多帮助开发人员设计.开发.测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具. #1: LogCat LogCat是Android中一个命令行工具,可以用于得到程序的log信息.Android日志系统提供了记录和查看系统调试信息的功能.日志都是从