构建一个.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 ...
随机推荐
- 洛谷——P1036 选数
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
- IDEA新手下载及和eclipse,myeclipse的区别
一:下载安装包,我们可以去官网下载.下载地址:http://www.jetbrains.com/idea/download/#secation=windows 二:IDEA的安装: 1.下载安装包后双 ...
- litepal创建数据库表失败
今天学习郭神的litepal框架遇到了一个坑,就是程序正常跑了,但是数据库和表完全没创建!!!!!!! 先核对了litepal.xml文件,确认配置正确,assets文件夹放的也正确,最后发现竟然是因 ...
- 立面图 平面图 剖面图 CAD
http://www.qinxue.com/88.html http://www.xsteach.com/course/2855 前后左右各个侧面的外部投影图——立面图:对建筑物各个侧面进行投影所得到 ...
- 【SQL Server 学习系列】-- 收缩数据库文件大小
USE WebExam; GO ALTER DATABASE WebExam SET RECOVERY SIMPLE; GO -- 收缩文件到 1 MB. ); GO ALTER DATABASE W ...
- NA交换①
常用的交换设备: 交换机(ASIC)和网桥(Brigde): 交换机的三种转发方式: 直通式(Cut-Through):一旦检测到MAC即转发,速度快但是无法保证准确性: ...
- C# 控制台程序如何输出Messagebox
1 添加如下引用 2 添加引用和Messagebox的代码. 3 测试可行
- 向海量用户发送数据哪家最强?上QDN下载LTE Broadcast SDK!
情境一: 在一个数万人的体育场内.作为一名观众你非常难看清运动员的面容.假设有了4G手机.你能够非常easy的打开直播应用.一边看直播讲解,一边体验现场气氛.但令人尴尬的是,现场几万人同一时候须要观看 ...
- web 开发之js---理解并解决IE的内存泄漏方式
程序当中任何编程内存操作不当都会导致内存泄漏 http://wenku.baidu.com/link?url=8ba4UIn1aaevxTagH-F4vID79-bAfxdcLdeujGFn7PBnv ...
- pagefile.sys
pagefile.sys