构建一个.net的干货类库,以便于快速的开发 - 工具类
相信每一个开发的框架都会有一个工具类,工具类的作用有很多,通常我会将最常用的方法放在工具类里
- 取得用户IP
- 取得网站根目录的物理路径
- 枚举相关
- 非法关键字检查
- 绝对路径改为相对路径
- 获取小数位(四舍五入 ,保留小数)
- 生成缩略图
当然每个开发框架的工具类都会不同,这里我只收录了这些方法,希望有更多需求的小伙伴也可以收录进工具类里
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的干货类库,以便于快速的开发 - 工具类的更多相关文章
- 构建一个.net的干货类库,以便于快速的开发 - 前言
前言: 工作已经快两年了,项目也做过不少,不知道大家有没有一个习惯,就是把在做项目过程中那些好的方法记录下来.我觉得这个习惯在开发的过程中还是很有用的,举个例子,我之前做过一个支付宝的支付功能,然后把 ...
- 构建一个.net的干货类库,以便于快速的开发 - 验证码
一个验证码对于一个网站的作用不言而喻,而随着技术的发展验证码的种类也开始多了起来,发展至今很多网站已经不再使用一种验证码,为满足需求程序猿就要写很多的方法来适应需求,今天我就来介绍我之前收集到的验证码 ...
- 构建一个.net的干货类库,以便于快速的开发 - 加密
在开发程序的时候,加密是一个程序一个必须的功能,基本上任何程序都会用到加密,而不同的加密方式又适应不同需求,有些加密是不可逆的,最常见是用于用户密码的加密,因为很多时候程序里面不该显示出用户的明文密码 ...
- 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式
上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...
- 干货:排名前16的Java工具类
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...
- 干货:排名前 16 的 Java 工具类!
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...
- 简单使用Laravel-admin构建一个功能强大的后台管理
Laravel-admin可以快速构建一个功能强大的后台,方便快速开发. 以下内容记录简单使用Laravel-admin,以及遇到小错误的解决方法. Laravel-admin 依赖以下环境 需要提前 ...
- 【云开发】10分钟零基础学会做一个快递查询微信小程序,快速掌握微信小程序开发技能(轮播图、API请求)
大家好,我叫小秃僧 这次分享的是10分钟零基础学会做一个快递查询微信小程序,快速掌握开发微信小程序技能. 这篇文章偏基础,特别适合还没有开发过微信小程序的童鞋,一些概念和逻辑我会讲细一点,尽可能用图说 ...
- 利用 vue-cli 构建一个 Vue 项目
一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...
随机推荐
- Help Jimmy DP
Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开始下落, ...
- openFileOutput 文件属性设置、主动配置文件的可读写属性及事实上现方式
首先參考 Android 内部存储相关的函数(getCacheDir,getDir, getFileStreamPath,getFilesDir,openFileInput, ...) 1. 用ope ...
- Excel数据字典转换为PDM(且显示表名、字段相应的中文描写叙述)
在工作中遇到了一个问题就是把Excel数据字典转换为PDM. 可是转换完毕了全是英文,原来对表名.字段名的中文描写叙述就没有了. 且对于这个问题在powerdesigner15.2以后能够直接完毕.可 ...
- ubuntu14.04 的ibus不能卸载(安装fcitx输入法框架时可能有这个需求)。出现无system setting有用程序
每年的ubuntu新版本号公布,都会吸引一大批热血青年. 关注越多也让ubuntu越来越好了. 使用ubuntu的人都会在安装系统之后马上安装顺手的输入法,也可能不会.看人. 安装输入法,对于中文输入 ...
- Spring和SpringMVC的关系
1.Spring和SpringMVC是父子容器关系. 2.Spring整体框架的核心思想是容器,用来管理bean的生命周期,而一个项目中会包含很多容器,并且它们分上下层关系,目前最常用的一个场景是在一 ...
- Android系统优化
这些事实上就是优化rom 的一些实用小技巧. 认为非常多还是实用的. Build.prop (编辑 /system/build.prop 文件(须要root, 能够用文件管理器或者其它root exp ...
- 我为什么从python转向go
应puppet大拿刘宇的邀请,我去西山居运维团队做了一个简短分享,谈谈为什么我要将我们的项目从python转向go. 坦白的讲,在一帮python用户面前讲为什么放弃python转而用go其实是一件压 ...
- 手推Apriori算法------挖掘频繁项集
版权声明:本文为博主原创文章,未经博主允许不得转载. Apriori算法: 使用一种称为逐层搜索的迭代方法,其中K项集用于搜索(K+1)项集. 首先,通过扫描数据库,统计每个项的计数,并收集满足最小支 ...
- mysql数据库中的十进位是什么意思?
一般在用小数的时候才有用,比如类型你设置了double,十进位你设为2,那么你可以放0.22的值,但是放0.222的值它会自动四舍五入为0.22,相当于小数位数吧
- SQLServer 存储过程 SET NOCOUNT { ON | OFF } 的使用
在JDBC中调用 sql server 的存储过程时“该语句没有返回结果集”异常: 解决方法:在存储过程首行加上 SET NOCOUNT ON 使返回的结果中不包含有关受 Transact-S ...