可空类型不可为空

时间:2016-12-01 14:59:21

标签: c# performance generics

我已经将可空类型的任务转换变量设置为不可空,如果它可以为空并且重新定义类型的默认值(如果需要的话)。我为它编写了泛型静态类,但遗憾的是,它的工作速度很慢。该类将用于从数据库读取数据到模型,因此性能非常重要。这是我的班级。

public static class NullableTypesValueGetter<T> where T : struct
{
    #region [Default types values]
    private static DateTime currentDefaultDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
    #endregion

    #region [Default types to string values]
    private const string nullableDateTimeValue = "DateTime?";
    #endregion

    public static T GetValue(dynamic value) 
    {
        if (Nullable.GetUnderlyingType(value.GetType()) != null)                           //if variable is nullable
        {
            var nullableValue = value as T?;
            //if variable has value
            if (nullableValue.HasValue)                                                    
            {
                return nullableValue.Value;
            }
            //if hasn't
            else                                                                          
            {
                var result = default(T);
                //extensionable code, determination default values
                var @switch = new Dictionary<Type, string>
                {
                    {typeof(DateTime?), nullableDateTimeValue}                            
                };
                //redefining result, if required
                if (@switch.Any(d => d.Key.Equals(nullableValue.GetType())))              
                {
                    switch (@switch[nullableValue.GetType()])
                    {
                        //extensionable code
                        case (nullableDateTimeValue):                                    
                        {
                            result = GetDefaultDateTimeValue();
                        } break;
                    }

                }

                return result;
            }
        }
        //if not nullable
        else                                                                              
        {
            return value;
        }
    }

    private static T GetDefaultDateTimeValue()
    {
        return (T)Convert.ChangeType(new DateTime?(currentDefaultDateTime), typeof(T));
    }
}

您是否了解此课程的任何其他实现或改善此课程表现的方法?

2 个答案:

答案 0 :(得分:5)

为什么不简单地使用Nullable<T>.GetValueOrDefault

int? val = null;
int newVal = val.GetValueOrDefault(-1); // result: -1

答案 1 :(得分:0)

我还没有真正考虑如何改进您的代码。

但我建议你采用完全不同的方法来提高性能。如果您在编译时知道数据库模式或数据POCO,而不是使用反射并确定要在运行时转换的类型,则可以使用T4脚本生成具有非可空属性的强类型POCO和必要的转换代码。 p>

这总是比在运行时使用反射快得多。