相信每一个开发的框架都会有一个工具类,工具类的作用有很多,通常我会将最常用的方法放在工具类里

  1. 取得用户IP
  2. 取得网站根目录的物理路径
  3. 枚举相关
  4. 非法关键字检查
  5. 绝对路径改为相对路径
  6. 获取小数位(四舍五入 ,保留小数)
  7. 生成缩略图

  当然每个开发框架的工具类都会不同,这里我只收录了这些方法,希望有更多需求的小伙伴也可以收录进工具类里

  

  1.取得用户IP

  做Web开发的一定会遇到获取用户IP的需求的,无论是用来记录登录时间,还是日志的记录,都要用到IP这个东西,而IP的记录一直是程序员开发的难题,因为这个IP是可以改的,也可以代理,所以在一定程度上会有偏差(IP这东西没用百分百的正确,如果有心不想让你知道的话总有办法不让你知道),所以这个方法只是说比较精确的一个获取IP的方法。

  /// <summary>
/// 取得用户IP
/// </summary>
/// <returns></returns>
public static string GetAddressIP()
{
///获取本地的IP地址
string AddressIP = string.Empty;
if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
{
AddressIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}
else
{
AddressIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
}
return AddressIP;
}

  

  2.取得网站根目录的物理路径

  

 /// <summary>
/// 取得网站根目录的物理路径
/// </summary>
/// <returns></returns>
public static string GetRootPath()
{
string AppPath = "";
HttpContext HttpCurrent = HttpContext.Current;
if (HttpCurrent != null)
{
AppPath = HttpCurrent.Server.MapPath("~");
}
else
{
AppPath = AppDomain.CurrentDomain.BaseDirectory;
if (Regex.Match(AppPath, @"\\$", RegexOptions.Compiled).Success)
AppPath = AppPath.Substring(, AppPath.Length - );
}
return AppPath;
}

  

  3.枚举相关

  枚举在开发中的使用也是非常频繁的,毕竟枚举能够使代码更加清晰,也提高了代码的维护性,所以枚举相关的方法就显得很是实用。

 /// <summary>
/// 获取枚举列表
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <returns>枚举列表</returns>
public static Dictionary<int, string> GetEnumList(Type enumType)
{
Dictionary<int, string> dic = new Dictionary<int, string>();
FieldInfo[] fd = enumType.GetFields();
for (int index = ; index < fd.Length; ++index)
{
FieldInfo info = fd[index];
object fieldValue = Enum.Parse(enumType, fd[index].Name);
object[] attrs = info.GetCustomAttributes(typeof(EnumTextAttribute), false);
foreach (EnumTextAttribute attr in attrs)
{
int key = (int)fieldValue;
if (key != -)//-100为NULL项
{
string value = attr.Text;
dic.Add(key, value);
}
}
}
return dic;
} /// <summary>
/// 获取枚举名称
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="id">枚举值</param>
/// <returns>如果枚举值存在,返回对应的枚举名称,否则,返回空字符</returns>
public static string GetEnumTextById(Type enumType, int id)
{
string ret = "";
Dictionary<int, string> dic = GetEnumList(enumType);
foreach (var item in dic)
{
if (item.Key == id)
{
ret = item.Value;
break;
}
} return ret;
} /// <summary>
/// 根据枚举值获取对应中文描述
/// </summary>
/// <param name="enumValue">枚举值</param>
/// <returns>枚举值中文描述</returns>
public static string GetEnumTextByEnum(object enumValue)
{
string ret = "";
if ((int)enumValue != -)
{
Dictionary<int, string> dic = GetEnumList(enumValue.GetType());
foreach (var item in dic)
{
if (item.Key == (int)enumValue)
{
ret = item.Value;
break;
}
}
} return ret;
} /// <summary>
/// 获取枚举名称
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="index">枚举值的位置编号</param>
/// <returns>如果枚举值存在,返回对应的枚举名称,否则,返回空字符</returns>
public static string GetEnumTextByIndex(Type enumType, int index)
{
string ret = ""; Dictionary<int, string> dic = GetEnumList(enumType); if (index < ||
index > dic.Count)
return ret; int i = ;
foreach (var item in dic)
{
if (i == index)
{
ret = item.Value;
break;
}
i++;
} return ret;
} /// <summary>
/// 获取枚举值
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="name">枚举名称</param>
/// <returns>如果枚举名称存在,返回对应的枚举值,否则,返回-1</returns>
public static int GetEnumIdByName(Type enumType, string name)
{
int ret = -; if (string.IsNullOrEmpty(name))
return ret; Dictionary<int, string> dic = GetEnumList(enumType);
foreach (var item in dic)
{
if (item.Value.CompareTo(name) == )
{
ret = item.Key;
break;
}
} return ret;
} /// <summary>
/// 获取名字对应枚举值
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="name">枚举名称</param>
/// <returns></returns>
public static T GetEnumIdByName<T>(string name) where T : new()
{
Type type = typeof(T);
T enumItem = new T();
enumItem = (T)TypeDescriptor.GetConverter(type).ConvertFrom("-1");
if (string.IsNullOrEmpty(name))
return enumItem;
FieldInfo[] fd = typeof(T).GetFields();
for (int index = ; index < fd.Length; ++index)
{
FieldInfo info = fd[index];
object fieldValue = Enum.Parse(type, fd[index].Name);
object[] attrs = info.GetCustomAttributes(typeof(EnumTextAttribute), false);
if (attrs.Length == )
{
EnumTextAttribute attr = (EnumTextAttribute)attrs[];
if (name.Equals(attr.Text))
{
enumItem = (T)fieldValue;
break;
}
}
}
return enumItem;
} /// <summary>
/// 获取枚举值所在的位置编号
/// </summary>
/// <param name="enumType">枚举的类型</param>
/// <param name="name">枚举名称</param>
/// <returns>如果枚举名称存在,返回对应的枚举值的位置编号,否则,返回-1</returns>
public static int GetEnumIndexByName(Type enumType, string name)
{
int ret = -; if (string.IsNullOrEmpty(name))
return ret; Dictionary<int, string> dic = GetEnumList(enumType);
int i = ;
foreach (var item in dic)
{
if (item.Value.CompareTo(name) == )
{
ret = i;
break;
}
i++;
} return ret;
}

  4.非法关键字检查

  非法关键字检查在很多网站上也有用到,这里我收录的方法并不是最好的,但也能满足一般的需求,我觉得最好是用一个文件来保存字库去维护是最好的,有需求的小伙伴可以去搜索一下。

  

 /// <summary>
/// 非法关键字检查
/// </summary>
/// <param name="Emtxt">要检查的字符串</param>
/// <returns>如果字符串里没有非法关键字,返回true,否则,返回false</returns>
public static bool CheckWord(string Emtxt)
{
string keyword = @"";//因为论坛也有关键字检查所以这里的字库就小伙伴们自己去找^_^
Regex regex = new Regex(keyword, RegexOptions.IgnoreCase);
if (regex.IsMatch(Emtxt))
{
return false;
}
return true;
} /// <summary>
/// SQL注入关键字过滤
/// </summary>
private const string StrKeyWord = @"^\s*select | select |^\s*insert | insert |^\s*delete | delete |^\s*from | from |^\s*declare | declare |^\s*exec | exec | count\(|drop table|^\s*update | update |^\s*truncate | truncate |asc\(|mid\(|char\(|xp_cmdshell|^\s*master| master |exec master|netlocalgroup administrators|net user|""|^\s*or | or |^\s*and | and |^\s*null | null "; /// <summary>
/// 关键字过滤
/// </summary>
/// <param name="_sWord"></param>
/// <returns></returns>
public static string ResplaceSql(string _sWord)
{
if (!string.IsNullOrEmpty(_sWord))
{
Regex regex = new Regex(StrKeyWord, RegexOptions.IgnoreCase);
_sWord = regex.Replace(_sWord, "");
_sWord = _sWord.Replace("'", "''");
return _sWord;
}
else
{
return "";
}
}

  5.绝对路径改为相对路径

  这个方法相对于前面的使用率并不是很高,在特定的情况下这个方法还是很有用的

 /// <summary>
/// 绝对路径改为相对路径
/// </summary>
/// <param name="relativeTo"></param>
/// <returns></returns>
public static string RelativePath(string relativeTo)
{
string absolutePath = GetRootPath();
string[] absoluteDirectories = absolutePath.Split('\\');
string[] relativeDirectories = relativeTo.Split('\\'); //获得这两条路径中最短的
int length = absoluteDirectories.Length < relativeDirectories.Length ? absoluteDirectories.Length : relativeDirectories.Length; //用于确定退出的循环中的地方
int lastCommonRoot = -;
int index; //找到共同的根目录
for (index = ; index < length; index++)
if (absoluteDirectories[index] == relativeDirectories[index])
lastCommonRoot = index;
else
break; //如果我们没有找到一个共同的前缀,然后抛出
if (lastCommonRoot == -)
throw new ArgumentException("Paths do not have a common base"); //建立相对路径
StringBuilder relativePath = new StringBuilder(); //加上 ..
for (index = lastCommonRoot + ; index < absoluteDirectories.Length; index++)
if (absoluteDirectories[index].Length > )
relativePath.Append("..\\"); //添加文件夹
for (index = lastCommonRoot + ; index < relativeDirectories.Length - ; index++)
relativePath.Append(relativeDirectories[index] + "\\");
relativePath.Append(relativeDirectories[relativeDirectories.Length - ]); return relativePath.ToString();
}

  6.获取小数位(四舍五入 ,保留小数)

  在日常处理数字相关的时候经常会用到的方法

        /// <summary>
/// 四舍五入,保留2位小数
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static decimal Rounding(decimal obj)
{
return Rounding(obj, );
}
/// <summary>
/// 四舍五入,保留n位小数
/// </summary>
/// <param name="obj"></param>
/// <param name="len">保留几位小数</param>
/// <returns></returns>
public static decimal Rounding(decimal obj, int len)
{
return Math.Round(obj, len, MidpointRounding.AwayFromZero);
} /// <summary>
/// 只舍不入,保留2位小数
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static decimal RoundingMin(decimal obj)
{
return RoundingMin(obj, );
} /// <summary>
/// 只舍不入,保留n位小数
/// </summary>
/// <param name="obj"></param>
/// <param name="len"></param>
/// <returns></returns>
public static decimal RoundingMin(decimal obj, int len)
{
var str = "0." + "".PadLeft(len, '') + "";
decimal dec = Convert.ToDecimal(str);
return Rounding(obj - dec, len);
} /// <summary>
/// 只舍不入,保留2位小数
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static decimal RoundingMax(decimal obj)
{
return RoundingMax(obj, );
} /// <summary>
/// 只舍不入,保留n位小数
/// </summary>
/// <param name="obj"></param>
/// <param name="len"></param>
/// <returns></returns>
public static decimal RoundingMax(decimal obj, int len)
{
var str = "0." + "".PadLeft(len, '') + "";
decimal dec = Convert.ToDecimal(str);
return Rounding(obj + dec, len);
}

  7.生成缩略图

  对于Web的开发来说,网站的空间是非常有限的,所以压缩图片就使得尤为重要。一张高清的图片对于网站的带宽来说是奢侈的,而且也占据非常大的空间,所以上传图片的时候经过一定的压缩对网站的各方面都会有更好的效果。

 /// <summary>
/// 生成缩略图
/// </summary>
/// <param name="sourceFile">原始图片文件</param>
/// <param name="quality">质量压缩比</param>
/// <param name="multiple">收缩倍数</param>
/// <param name="outputFile">输出文件名</param>
/// <returns>成功返回true,失败则返回false</returns>
public static bool ThumImage(string sourceFile, long quality, int multiple, string outputFile)
{
try
{
long imageQuality = quality;
Bitmap sourceImage = new Bitmap(sourceFile);
ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg");
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters();
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, imageQuality);
myEncoderParameters.Param[] = myEncoderParameter;
float xWidth = sourceImage.Width;
float yWidth = sourceImage.Height;
Bitmap newImage = new Bitmap((int)(xWidth / multiple), (int)(yWidth / multiple));
Graphics g = Graphics.FromImage(newImage); g.DrawImage(sourceImage, , , xWidth / multiple, yWidth / multiple);
g.Dispose();
newImage.Save(outputFile, myImageCodecInfo, myEncoderParameters);
sourceImage.Dispose();
System.IO.File.Delete(sourceFile);
return true;
}
catch (Exception e)
{
return false;
} } /// <summary>
/// 获取图片编码信息
/// </summary>
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (j = ; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}

构建一个.net的干货类库,以便于快速的开发 - 工具类的更多相关文章

  1. 构建一个.net的干货类库,以便于快速的开发 - 前言

    前言: 工作已经快两年了,项目也做过不少,不知道大家有没有一个习惯,就是把在做项目过程中那些好的方法记录下来.我觉得这个习惯在开发的过程中还是很有用的,举个例子,我之前做过一个支付宝的支付功能,然后把 ...

  2. 构建一个.net的干货类库,以便于快速的开发 - 验证码

    一个验证码对于一个网站的作用不言而喻,而随着技术的发展验证码的种类也开始多了起来,发展至今很多网站已经不再使用一种验证码,为满足需求程序猿就要写很多的方法来适应需求,今天我就来介绍我之前收集到的验证码 ...

  3. 构建一个.net的干货类库,以便于快速的开发 - 加密

    在开发程序的时候,加密是一个程序一个必须的功能,基本上任何程序都会用到加密,而不同的加密方式又适应不同需求,有些加密是不可逆的,最常见是用于用户密码的加密,因为很多时候程序里面不该显示出用户的明文密码 ...

  4. 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式

    上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...

  5. 干货:排名前16的Java工具类

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  6. 干货:排名前 16 的 Java 工具类!

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  7. 简单使用Laravel-admin构建一个功能强大的后台管理

    Laravel-admin可以快速构建一个功能强大的后台,方便快速开发. 以下内容记录简单使用Laravel-admin,以及遇到小错误的解决方法. Laravel-admin 依赖以下环境 需要提前 ...

  8. 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)

    大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...

  9. 利用 vue-cli 构建一个 Vue 项目

    一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...

随机推荐

  1. COGS2479(四维偏序)

    题意:给定一个有n个元素的序列,元素编号为1~n,每个元素有三个属性a,b,c,求序列中满足i<j且ai<aj且bi<bj且ci<cj的数对(i,j)的个数. 分析:cdq分治 ...

  2. Ubuntu 16.04安装WinRAR/7-Zip(基于CrossOver)

    基于CrossOver的WinRAR/7-Zip有如下缺点: 1.不能像Windows那样右键菜单解压 可以解决的问题: 1.可以使用提供的浏览工具进行文件选择再解压,只是在操作上多一步. 2.类似百 ...

  3. Servlet表单数据处理

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/form-data.html: 当需要从浏览器到Web服务器传递一些信息并最终传回到后台程序时,一 ...

  4. 彻底来理解下hashmap吧

    1.什么叫hashmap? 答:首先是一种map集合,其次呢,它是一种利用hash表来存储的数据结构.所以叫hashmap. 2.hashmap的特点是什么? 答:hashmap的特点是key值不能重 ...

  5. 使用Tornado实现http代理

    0x00 http代理 http代理的用处非常多,市面上也有公开的代理,可是有时候为了工作须要,比方分析应用层流量.做数据訪问控制.甚至做监控等等.Tornado提供了一些非常方便的环境和API,我们 ...

  6. golang中关闭http server

    golange 开启http server 服务之后,怎么关闭呢? ------------------------------------------------------------------ ...

  7. 1451 - Average 高速求平均值

    怎样高速求取一段区间的平均值 用前缀的思想来看 很easy 可是 本题题意要求的是 大于等于一段长度的区间的平均值的最大值 并且给出的数据范围非常大 O(n*L)的直白比較算法 用于解决此问题不合适 ...

  8. 怎么在当前的view上获取所在的控制器(UIViewController),实现跳转

    - (UIViewController *)viewController { for (UIView* next = [self superview]; next; next = next.super ...

  9. android EditText如何使光标随着输入内容移动

    EditText 使光标随着输入内容移动的setSelection()

  10. Ado.net设计模式

    连接类 连接类有固定的使用模式,这是常用的乐观模式: using (var conn = new SqlConnection(connstr)) { conn.Open(); //执行各种数据库操作 ...