上班划水,下班滑冰。。
相信大家很多都写过读取ini文件的代码,最近我常常用到这个地方。而写好的读取iniwen文件的方法返回值是个string类型的。
于是不得不在读取字符串后根据场景来进行与其他值类型的转换,根据逻辑来说hao好像并没有什么问题。但是觉得麻烦的我就在想能不能将该方法ji进一步优化,减少我们的工作量。于是乎,出现了下面的代码:
public static T ReadValue<T>(String section, String key, T defaultValue)
{
var t = typeof(T);
INIApplication iniobj = new INIApplication("./test.ini");
//从ini读取字符串
String tmp = iniobj.IniReadValue(section, key);
MethodInfo tryParse = t.GetMethod("TryParse",//方法名
BindingFlags.Public | BindingFlags.Static | BindingFlags.Default,//筛选条件
Type.DefaultBinder,//绑定
new Type[] { tmp.GetType(), t.MakeByRefType() },//参数类型
new ParameterModifier[] { new ParameterModifier(2) }//参数个数
);
try
{
if (tryParse == null && (!String.IsNullOrWhiteSpace(tmp))) return (T)(tmp as object);
//参数列表
var parameters = new object[] { tmp, Activator.CreateInstance(t) };
return (bool)tryParse.Invoke(null, parameters) ? (T)parameters[1] : defaultValue;
}
catch (Exception)
{
return defaultValue;
}
}
这里根据我们传入的类型,GetMethod方法会获取当前类型的TryParse方法,读出ini字符串之后可以自动转换成我们想要的类型。其中GetMethod参数的注释是我自己的理解,有什么不对的地方还请指教。官网对参数的解释如下:
GetMethod(String, BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[]) |
参数
name
包含要获取的方法名称的字符串。
bindingAttr
一个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。
- 或 - 零,以返回 null
。
binder
一个对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。
或 要使用 Nothing
的空引用(在 Visual Basic 中为 DefaultBinder)。
callConvention
该对象用于指定要使用的一套规则,这些规则涉及自变量的顺序和布局、传递返回值的方式、用于自变量的寄存器和清理堆栈的方式。
types
Type[]
表示此方法要获取的参数的个数、顺序和类型的 Type 对象数组。
- 或 - 空的 Type 对象数组(由 EmptyTypes 字段提供),用来获取不采用参数的方法。
modifiers
ParameterModifier 对象的数组,表示与 types
数组中的相应元素关联的特性。 仅当通过 COM 互操作进行调用时才使用,而且仅处理通过引用传递的参数。 默认的联编程序不处理此参数。
返回
表示符合指定要求的方法的对象(如果找到的话);否则为 null
。