C# 比较存储在对象中的数值>;=指向另一个对象
在我的程序中,我正在从表中读取SchemData。 我需要确定列的大小,并在运行时确定是否有给定的值 与列大小匹配,并且可以写入该列。 对于字母数字类型,如char、nvarchar、,。。。这没问题 但对于数值,我无法将该值与列大小进行比较,因为如果我在这里的理解是正确的,列大小将为我提供存储在该列中的字节数 所以我想检查我的数值是否在该列的System.type变量中存储的特定数据类型的MaxValue范围内 我从使用反射确定MaxValue开始,还识别了如下可空类型:C# 比较存储在对象中的数值>;=指向另一个对象,c#,object,compare,type-conversion,C#,Object,Compare,Type Conversion,在我的程序中,我正在从表中读取SchemData。 我需要确定列的大小,并在运行时确定是否有给定的值 与列大小匹配,并且可以写入该列。 对于字母数字类型,如char、nvarchar、,。。。这没问题 但对于数值,我无法将该值与列大小进行比较,因为如果我在这里的理解是正确的,列大小将为我提供存储在该列中的字节数 所以我想检查我的数值是否在该列的System.type变量中存储的特定数据类型的MaxValue范围内 我从使用反射确定MaxValue开始,还识别了如下可空类型: public sta
public static Object GetMaxValue(this Type type)
{
var t = GetNullableType(type);
var f = t.GetField("MaxValue");
if (f == null)
return null;
else
return f.GetValue(null);
}
public static Type GetNullableType(Type type)
{
Type retType = type;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
var nullableConverter = new System.ComponentModel.NullableConverter(type);
retType = nullableConverter.UnderlyingType;
}
return retType;
}
有没有人有比实施这样一种方法更好的想法?
提前感谢。您可以使用Convert.ChangeType和IComparable来解决此问题。所有基元类型都继承自IComparable。 这段代码在我这端起作用了。 如果转换类型不正确,请确保在ChangeType引发格式异常时捕获内部或外部异常
public static bool TestMaxValue(this Type type, object compare)
{
var t = GetNullableType(type);
var mv = t.GetMaxValue();
bool ret = false;
try
{
IComparable maxValue = Convert.ChangeType(mv, t) as IComparable;
IComparable currentValue = Convert.ChangeType(compare, t) as IComparable;
if (maxValue != null && currentValue != null)
ret = maxValue.CompareTo(currentValue) > 0;
}
catch (FormatException exception)
{
//handle is here
ret = false;
}
return ret;
}
尽管建议不要编写扩展方法,因为这样会降低类型安全性。分别为特定类型创建扩展方法,如
public static bool TestMaxValue(this int? value, int compareValue)
{
var intValue = value.GetValueOrDefault();
var ret = intValue.CompareTo(compareValue) > 0;
return ret;
}
我不确定您所依赖的存储类型(以及您打算测量的宽度类型),但在大多数情况下(据我所知),最大/最小值定义为给定类型的函数。也就是说,如果类型是字符串,则按其长度(从长度1到长度100),如果是整数乘以整数(1到1000),等等。例如,如果要将数值存储到字符串列中,则将强制将其转换为字符串,因此无论如何都将应用字符串规则(长度)。我遗漏了什么吗?我想在数字列中存储一个数值。我所读取的xml文件中的数据对我来说是未知的。我将获得xml文件的路径并读取它。我在那里得到的数据需要存储在一个表中,如果可以存储在匹配列中,则需要首先检查每个值。因此,我需要确定该列的数据类型(我从GetSchemaTable()获取),并根据xml文件的传入值测试该类型的MaxValue。我希望我能尽可能准确地描述,否则再问一次:)。在不知道您正在处理的类型的情况下执行任何类型的操作(存储或任何其他事情)都是不可取的(轻声说)。无论如何你都不应该那样做。您可以始终依赖字符串(以及检查大小时使用的字符串长度)。但是,存储您不知道其类型的东西似乎没有太大意义,这是给定信息位的一个基本定义特性。你要么把类型和信息一起存储,要么“猜一猜”;例如,了解数字类型很简单。我不想讨论做某事或不做某事有多大意义。我有一个规范,它说,读取一个xml文件,其中元素标记是列的名称。如果该标记的属性中存储的值适合此列,请检查该列。如果不合适,请继续下一个。等等这应该是来自不同系统的某种导入,其中xml文件每次都是该格式,但可能值与定义的导入表不匹配。回答“不知道你正在处理的类型”:我知道该专栏的类型。我通过从DataReader读取SchemTable获得它。我只是想知道是否有比实现问题中所示的TestMaxValue这样的函数更好的方法。我认为它需要大于或等于零。ret=maxValue.CompareTo(currentValue)>=0;因为MaxValue告诉您最后一个可能的值。但无论如何,这是一个很好的解决方案,谢谢。
public static bool TestMaxValue(this int? value, int compareValue)
{
var intValue = value.GetValueOrDefault();
var ret = intValue.CompareTo(compareValue) > 0;
return ret;
}