在C#中获取动态类型的最大值

时间:2014-01-04 11:13:31

标签: c# types

我在C#中编写了一个方法,它返回Type并基于此类型(int或long)

private Type GetNumberColumnType(INumberedEntity entity)
{
    var numberRow = SG.Framework.Numbering.NumberingService.NumberableEntities.Where(ne => ne.GetType().FullName == entity.ToString()).FirstOrDefault();
    var row = (DataRow)numberRow;
    return row.Table.Columns[numberRow.NumberColumnName].DataType;
}

我想得到:

GetNumberColumnType(INumberedEntity entity).MaxValue 

而不是:

if( GetNumberColumnType(entity) == typeof(long))
   long.MaxValue
else
   int.MaxValue

我该怎么办?

1 个答案:

答案 0 :(得分:6)

如果您不介意使用反射,请按照以下说明进行操作。

var type = GetNumberColumnType(entity);
FieldInfo fi = type.GetField("MaxValue");
if(fi!=null && fi.IsLiteral && !fi.IsInitOnly)
{
    object value = fi.GetRawConstantValue();
}

正如评论中所指出的,反射是昂贵的,因为这些只是你可以进行查找的常量

internal class MaxValueCache
{
    private static readonly Dictionary<Type, object> maxValues = new Dictionary<Type, object>()
    {
        { typeof(int), int.MaxValue},
        { typeof(long), long.MaxValue}
        //...
    };

    public static object GetMaxValue(Type type)
    {
        return maxValues[type];
    }
}

然后使用

var type = GetNumberColumnType(entity);
object value = MaxValueCache.GetMaxValue(type);