构建一个.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 ...
随机推荐
- Python安装与基本数据类型
人生苦短,我选Python. Python比其他的语言来说真的简洁多了,很多时候想做的东西都有对应的模块可以导入,平时玩点小东西真心不错. 首先讲一下安装,其实没什么好讲的,点点点点点,完事. 这里的 ...
- COLLECTL LINUX 监控
http://blog.csdn.net/leichelle/article/details/23590289
- mysql导入大型sql文件时注意事项
原文:http://blog.csdn.net/k21325/article/details/70808563 大型sql文件,需要在my.ini(windows)或者my.cnf(Linux)中设置 ...
- the apple code
i know you will forget but 9 you will
- Core Data 的简单使用
认识cocoa Data在ios开发中的环境情况. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/f ...
- (6)文本挖掘(三)——文本特征TFIDF权重计算及文本向量空间VSM表示
建立文本数据数学描写叙述的过程分为三个步骤:文本预处理.建立向量空间模型和优化文本向量. 文本预处理主要採用分词.停用词过滤等技术将原始的文本字符串转化为词条串或者特点的符号串.文本预处理之后,每个文 ...
- 使用Swift模拟Window-LFU
今天參加了某公司2015的校招的机试,大题开放题比較多.有一道大题是Window-LFU比較有意思,当时题目搞了半天没搞明确让干啥- -题目大概是这种:实现一个Window-LFU缓存(事实上就是用数 ...
- CSS Modules 解决 react 项目 css 样式互相影响的问题
1. CSS Modules引入目的 写过CSS的人,应该都对一大长串选择器选中一个元素不陌生吧,这种方式,其实定义的就是全局样式,我们时常会因为选择器权重问题,没有把我们想要的样式加上去. 另外,每 ...
- hdu oj 3127 WHUgirls(2009 Asia Wuhan Regional Contest Online)
WHUgirls Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total ...
- Mac OS 10.10.3下Apache + mod_wsgi配置【一】
[一] 首先,MAC是自带Apache的,在/private/etc/apache2路径下,能够使用apachectl -v查看版本号.我的版本号例如以下: Server version: Apach ...