验证整数、双精度的通用方法.如何使用 GetType()
本文关键字:何使用 GetType 方法 整数 双精度 验证 | 更新日期: 2023-09-27 18:30:54
我正在尝试编写一个验证方法。例如:对于双倍,它看起来像这样:
protected bool ValidateLoopAttributes(string i_value, double i_threshold)
{
double result;
if (!(double.TryParse(i_value, out result) && result >= i_threshold))
{
return false;
}
return true;
}
是否可以将其写为:
protected bool ValidateLoopAttributes<T>(string i_value, T i_threshold)
然后使用类似的东西
T.GetType().TryParse() // how can i use here the type's methods??
使用 switch/if 语句是唯一的方法吗?例如:
If (T.GetType() is int)
Int32.TryParse(i_threshold)
还有比这更优雅的方式吗?
试试这个:
static class Ext
{
public static bool TryParse<T>(string s, out T value)
{
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
try
{
value = (T)converter.ConvertFromString(s);
return true;
}
catch
{
value = default(T);
return false;
}
}
public static bool ValidateLoopAttributes<T>(string i_value, T i_threshold)
where T : IComparable
{
T outval;
if (TryParse<T>(i_value, out outval))
return outval.CompareTo(i_threshold) >= 0;
else return false;
}
}
我的回答使用了Marc Gravell从这里取来的答案。
有了这个你可以做到
bool b1 = Ext.ValidateLoopAttributes<int>("5", 4);
bool b2 = Ext.ValidateLoopAttributes<double>("5.4", 5.5d);
如果您觉得有用,还可以使用扩展方法
public static bool ValidateLoopAttributes<T>(this string i_value, T i_threshold)
where T : IComparable { }
这导致您使用
bool b1 = "5".ValidateLoopAttributes<int>(4);
bool b2 = "5.4".ValidateLoopAttributes<double>(5.5d);
目前,您在方法中混合了两件事 - 解析和业务规则。假设您调用ValidateLoopAttributes(value, 4)
,它返回false
。可能的原因:
- 字符串不包含值。例如,空、某些字符等。
- 字符串不包含整数值。例如,它具有双精度值。
- 字符串包含整数值,但它超过了阈值。
- 没有为您的类型定义转换器。
在第一种情况下,您的源中有无效数据。在第二种情况下,您有无效的代码,应该使用双精度。在第三种情况下,代码是可以的,但业务规则被破坏了。在最后一种情况下(双精度或整数不是这种情况,但是如果您编写对类型没有限制的通用代码,则允许其他人使用任何类型调用它)在代码中也存在问题。
因此,请考虑分离业务规则和解析数据。
Foo foo = Parse(xml);
RunBusinessRules(foo);
public static bool ValidateLoopAttributes<T>(string value, T threshold)
where T : IComparable
{
try
{
var parseMethod = typeof(T).GetMethod("Parse", new[] {typeof (string)});
var result = (T) parseMethod.Invoke(null, new object[] {value});
return result.CompareTo(threshold) < 0;
}
catch (Exception)
{
return false;
}
}
显然,这仅适用于具有静态 Parse 方法的类型。
可以尝试使用这样的东西来检查这是否是整数:
public static bool IsNumericValue(string val, System.Globalization.NumberStyles NumberStyle)
{
double result;
return Double.TryParse(val,NumberStyle,
System.Globalization.CultureInfo.CurrentCulture,out result);
}
等等
IsNumericValue("1.2", System.Globalization.NumberStyles.Integer) // FALSE
和上
IsNumericValue("12", System.Globalization.NumberStyles.Integer) // TRUE
请注意,在此示例中,我使用了 CurrectCulture
,如果它们不同,请根据您的需求进行调整。