应该是如下的函数
public static bool MyComparer(string type,object v,string minValue,string maxValue)
其中type是System.Char,System.Int32,System.System.UInt16....等基本值类型(包括System.String)字符串表示形式
object v,是type类型的一个值
minValue和maxValue分别是type类型的值的字符串表示
如是调用
bool ret = MyComparer("System.Int32",2,"1","3");
那么ret = true;//因为1<2<3;
ret = MyComparer(("System.Int32",3,"1","2");
那么ret = false;//因为3 >2
现在请各位高手指点这个函数的实现。
我用反射写了一个,不需要指定 type ,程序会根据 v 自动判断,并进行比较。
public static bool MyComparer(object v, string minValue, string maxValue)
{
IComparable comparableObj = v as IComparable;
MethodInfo parseMethod = null;
object min;
object max;
if (v is string)
{
min = minValue;
max = maxValue;
}
else
{
foreach (MethodInfo mi in v.GetType().GetMethods(BindingFlags.Static | BindingFlags.Public))
{
if (mi.Name == "Parse" && mi.GetParameters().Length == 1)
{
parseMethod = mi;
break;
}
}
if (parseMethod == null)
{
throw new ArgumentException(string.Format("Invalid type: {0}", v.GetType()));
}
min = parseMethod.Invoke(null, new object[] { minValue });
max = parseMethod.Invoke(null, new object[] { maxValue });
}
return comparableObj.CompareTo(min) >= 0 && comparableObj.CompareTo(max) <= 0;
}
为此写了一篇个博客,网友们又提出了不少好的建议,我又做了一些改进。
见 http://www.cnblogs.com/eaglet/archive/2009/06/05/1496697.html
本想绕道用个 泛型 的方法解决这个问题,毕竟原则上可以在编译期间就杜绝类型错误。但查了查,貌似没有统一转换的接口,唉!如何解决静态方法的不可继承问题呢?或者有个 T Parse<T>(string value) 的方法。看来还是反射牛逼啊,偶尔躲不开啊。
class MyComparer
{
public static bool Compare<T>(T value, T minValue, T maxValue) where T : IComparable
{
if (value.CompareTo(minValue) > 0 && value.CompareTo(maxValue) < 0)
{
return true;
}
return false;
}
}