Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较存储在对象中的数值>;=指向另一个对象_C#_Object_Compare_Type Conversion - Fatal编程技术网

C# 比较存储在对象中的数值>;=指向另一个对象

C# 比较存储在对象中的数值>;=指向另一个对象,c#,object,compare,type-conversion,C#,Object,Compare,Type Conversion,在我的程序中,我正在从表中读取SchemData。 我需要确定列的大小,并在运行时确定是否有给定的值 与列大小匹配,并且可以写入该列。 对于字母数字类型,如char、nvarchar、,。。。这没问题 但对于数值,我无法将该值与列大小进行比较,因为如果我在这里的理解是正确的,列大小将为我提供存储在该列中的字节数 所以我想检查我的数值是否在该列的System.type变量中存储的特定数据类型的MaxValue范围内 我从使用反射确定MaxValue开始,还识别了如下可空类型: public sta

在我的程序中,我正在从表中读取SchemData。 我需要确定列的大小,并在运行时确定是否有给定的值 与列大小匹配,并且可以写入该列。 对于字母数字类型,如char、nvarchar、,。。。这没问题

但对于数值,我无法将该值与列大小进行比较,因为如果我在这里的理解是正确的,列大小将为我提供存储在该列中的字节数

所以我想检查我的数值是否在该列的System.type变量中存储的特定数据类型的MaxValue范围内

我从使用反射确定MaxValue开始,还识别了如下可空类型:

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;
        }