Code optimization

This commit is contained in:
sunkaixuan
2017-06-07 02:12:04 +08:00
parent 71e7765647
commit f16280b57f
3 changed files with 98 additions and 153 deletions

View File

@@ -33,7 +33,7 @@ namespace SqlSugar
this.DataRecord = dataRecord; this.DataRecord = dataRecord;
this.DynamicBuilder = new IDataReaderEntityBuilder<T>(); this.DynamicBuilder = new IDataReaderEntityBuilder<T>();
this.ReaderKeys = new List<string>(); this.ReaderKeys = new List<string>();
} }
#endregion #endregion
#region Fields #region Fields
@@ -108,7 +108,7 @@ namespace SqlSugar
} }
if (propertyInfo != null && propertyInfo.GetSetMethod() != null) if (propertyInfo != null && propertyInfo.GetSetMethod() != null)
{ {
if (propertyInfo.PropertyType.IsClass()&& propertyInfo.PropertyType!=PubConst.ByteArrayType) if (propertyInfo.PropertyType.IsClass() && propertyInfo.PropertyType != PubConst.ByteArrayType)
{ {
BindClass(generator, result, propertyInfo); BindClass(generator, result, propertyInfo);
} }
@@ -125,7 +125,7 @@ namespace SqlSugar
generator.Emit(OpCodes.Ret); generator.Emit(OpCodes.Ret);
DynamicBuilder.handler = (Load)method.CreateDelegate(typeof(Load)); DynamicBuilder.handler = (Load)method.CreateDelegate(typeof(Load));
return DynamicBuilder; return DynamicBuilder;
} }
#endregion #endregion
#region Private methods #region Private methods
@@ -151,168 +151,87 @@ namespace SqlSugar
} }
private void BindMethod(ILGenerator generator, PropertyInfo bindProperty, int ordinal) private void BindMethod(ILGenerator generator, PropertyInfo bindProperty, int ordinal)
{ {
var isNullableType = false; IDbBind bind = Context.Ado.DbBind;
var bindPropertyType = PubMethod.GetUnderType(bindProperty, ref isNullableType); bool isNullableType = false;
MethodInfo method = null;
Type bindPropertyType = PubMethod.GetUnderType(bindProperty, ref isNullableType);
string dbTypeName = DataRecord.GetDataTypeName(ordinal); string dbTypeName = DataRecord.GetDataTypeName(ordinal);
string propertyName = bindProperty.Name; string propertyName = bindProperty.Name;
var bind = Context.Ado.DbBind; string validPropertyName = bind.GetPropertyTypeName(dbTypeName);
List<string> guidThrow = bind.GuidThrow; validPropertyName = validPropertyName == "byte[]" ? "byteArray" : validPropertyName;
List<string> intThrow = bind.IntThrow; CSharpDataType validPropertyType = (CSharpDataType)Enum.Parse(typeof(CSharpDataType), validPropertyName);
List<string> stringThrow = bind.StringThrow; string bindProperyTypeName = bindPropertyType.Name.ToLower();
List<string> decimalThrow = bind.DecimalThrow; bool isEnum = bindPropertyType.IsEnum;
List<string> doubleThrow = bind.DoubleThrow; if (isEnum) { validPropertyType = CSharpDataType.@enum; }
List<string> dateThrow = bind.DateThrow; switch (validPropertyType)
List<string> shortThrow = bind.ShortThrow;
MethodInfo method = null;
var validPropertyTypeName = bind.GetPropertyTypeName(dbTypeName);
var bindProperyTypeName = bindPropertyType.Name.ToLower();
var isEnum = bindPropertyType.IsEnum;
if (isEnum)
{ {
validPropertyTypeName = "enum"; case CSharpDataType.@int:
CheckType(bind.IntThrow, bindProperyTypeName, validPropertyName, propertyName);
method = isNullableType ? getConvertInt32 : getInt32;
break;
case CSharpDataType.@bool:
if (bindProperyTypeName == "bool" || bindProperyTypeName == "boolean")
method = isNullableType ? getConvertBoolean : getBoolean;
break;
case CSharpDataType.@string:
CheckType(bind.StringThrow, bindProperyTypeName, validPropertyName, propertyName);
method = getString;
break;
case CSharpDataType.DateTime:
CheckType(bind.DateThrow, bindProperyTypeName, validPropertyName, propertyName);
if (bindProperyTypeName == "datetime")
method = isNullableType ? getConvertDateTime : getDateTime;
break;
case CSharpDataType.@decimal:
CheckType(bind.DecimalThrow, bindProperyTypeName, validPropertyName, propertyName);
if (bindProperyTypeName == "decimal")
method = isNullableType ? getConvertDecimal : getDecimal;
break;
case CSharpDataType.@double:
CheckType(bind.DoubleThrow, bindProperyTypeName, validPropertyName, propertyName);
if (bindProperyTypeName == "double")
method = isNullableType ? getConvertDouble : getDouble;
break;
case CSharpDataType.Guid:
CheckType(bind.GuidThrow, bindProperyTypeName, validPropertyName, propertyName);
if (bindProperyTypeName == "guid")
method = isNullableType ? getConvertGuid : getGuid;
break;
case CSharpDataType.@byte:
method = isNullableType ? getConvertByte : getByte;
break;
case CSharpDataType.@enum:
method = isNullableType ? getConvertEnum_Null.MakeGenericMethod(bindPropertyType) : getEnum.MakeGenericMethod(bindPropertyType);
break;
case CSharpDataType.@short:
CheckType(bind.ShortThrow, bindProperyTypeName, validPropertyName, propertyName);
if (bindProperyTypeName == "int16" && bindProperyTypeName == "short")
method = isNullableType ? getConvertInt16 : getInt16;
break;
case CSharpDataType.@long:
method = isNullableType ? getConvetInt64 : getInt64;
break;
default:
method = getValueMethod;
break;
} }
else if (validPropertyTypeName.IsIn("byte[]", "other", "object") || dbTypeName.Contains("hierarchyid")) if (method == null)
method = getOtherNull.MakeGenericMethod(bindPropertyType);
generator.Emit(OpCodes.Call, method);
if (method == getValueMethod)
{ {
generator.Emit(OpCodes.Call, getValueMethod);
generator.Emit(OpCodes.Unbox_Any, bindProperty.PropertyType); generator.Emit(OpCodes.Unbox_Any, bindProperty.PropertyType);
return;
}
if (isNullableType)
{
switch (validPropertyTypeName)
{
case "int":
CheckType(intThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
var isNotInt = bindProperyTypeName != "int32";
if (isNotInt)
method = getOtherNull.MakeGenericMethod(bindPropertyType);
else
method = getConvertInt32; break;
case "bool":
if (bindProperyTypeName != "bool" && bindProperyTypeName != "boolean")
method = getOtherNull.MakeGenericMethod(bindPropertyType);
else
method = getConvertBoolean; break;
case "string":
CheckType(stringThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
method = getString; break;
case "DateTime":
CheckType(dateThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
if (bindProperyTypeName != "datetime")
method = getOtherNull.MakeGenericMethod(bindPropertyType);
else
method = getConvertDateTime; break;
case "decimal":
CheckType(decimalThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
var isNotDecimal = bindProperyTypeName != "decimal";
if (isNotDecimal)
method = getOtherNull.MakeGenericMethod(bindPropertyType);
else
method = getConvertDecimal; break;
case "double":
CheckType(doubleThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
var isNotDouble = bindProperyTypeName != "double";
if (isNotDouble)
method = getOtherNull.MakeGenericMethod(bindPropertyType);
else
method = getConvertDouble; break;
case "Guid":
CheckType(guidThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
if (bindProperyTypeName != "guid")
method = getOtherNull.MakeGenericMethod(bindPropertyType);
else
method = getConvertGuid; break;
case "byte":
method = getConvertByte; break;
case "enum":
method = getConvertEnum_Null.MakeGenericMethod(bindPropertyType); break;
case "short":
CheckType(shortThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
var isNotShort = bindProperyTypeName != "int16" && bindProperyTypeName != "short";
if (isNotShort)
method = getOtherNull.MakeGenericMethod(bindPropertyType);
else
method = getConvertInt16;
break;
default:
method = getOtherNull.MakeGenericMethod(bindPropertyType); break;
}
generator.Emit(OpCodes.Call, method);
}
else
{
switch (validPropertyTypeName)
{
case "int":
CheckType(intThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
var isNotInt = bindProperyTypeName != "int32";
if (isNotInt)
method = getOther.MakeGenericMethod(bindPropertyType);
else
method = getInt32; break;
case "bool":
if (bindProperyTypeName != "bool" && bindProperyTypeName != "boolean")
method = getOther.MakeGenericMethod(bindPropertyType);
else
method = getBoolean; break;
case "string":
CheckType(stringThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
method = getString; break;
case "DateTime":
CheckType(dateThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
if (bindProperyTypeName != "datetime")
method = getOther.MakeGenericMethod(bindPropertyType);
else
method = getDateTime; break;
case "decimal":
CheckType(decimalThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
var isNotDecimal = bindProperyTypeName != "decimal";
if (isNotDecimal)
method = getOther.MakeGenericMethod(bindPropertyType);
else
method = getDecimal; break;
case "double":
CheckType(doubleThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
var isNotDouble = bindProperyTypeName != "double";
if (isNotDouble)
method = getOther.MakeGenericMethod(bindPropertyType);
else
method = getDouble; break;
case "guid":
CheckType(guidThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
if (bindProperyTypeName != "guid")
method = getOther.MakeGenericMethod(bindPropertyType);
else
method = getGuid; break;
case "byte":
method = getByte; break;
case "enum":
method = getEnum.MakeGenericMethod(bindPropertyType); break;
case "short":
CheckType(shortThrow, bindProperyTypeName, validPropertyTypeName, propertyName);
var isNotShort = bindProperyTypeName != "int16" && bindProperyTypeName != "short";
if (isNotShort)
method = getOther.MakeGenericMethod(bindPropertyType);
else
method = getInt16;
break;
default: method = getOther.MakeGenericMethod(bindPropertyType); break; ;
}
generator.Emit(OpCodes.Call, method);
if (method == getValueMethod)
{
generator.Emit(OpCodes.Unbox_Any, bindProperty.PropertyType);
}
} }
} }
private void CheckType(List<string> errorTypes, string objType, string transformedPropertyName, string propertyName)
private void CheckType(List<string> invalidTypes, string bindProperyTypeName, string validPropertyType, string propertyName)
{ {
var isAny = errorTypes.Contains(objType); var isAny = invalidTypes.Contains(bindProperyTypeName);
if (isAny) if (isAny)
{ {
throw new SqlSugarException(string.Format("{0} can't convert {1} to {2}", propertyName, transformedPropertyName, objType)); throw new SqlSugarException(string.Format("{0} can't convert {1} to {2}", propertyName, validPropertyType, bindProperyTypeName));
} }
} }
#endregion #endregion
} }
} }

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SqlSugar
{
public enum CSharpDataType
{
@int,
@bool,
@string,
@DateTime,
@decimal,
@double,
@Guid,
@byte,
@enum,
@short,
@long,
@object,
@other,
@byteArray
}
}

View File

@@ -65,6 +65,7 @@
<Compile Include="Abstract\UpdateProvider\UpdateableProvider.cs" /> <Compile Include="Abstract\UpdateProvider\UpdateableProvider.cs" />
<Compile Include="Entities\SchemaInfo.cs" /> <Compile Include="Entities\SchemaInfo.cs" />
<Compile Include="Enum\DbObjectType.cs" /> <Compile Include="Enum\DbObjectType.cs" />
<Compile Include="Enum\ProperyType.cs" />
<Compile Include="ExpressionsToSql\Common\FileHeper.cs" /> <Compile Include="ExpressionsToSql\Common\FileHeper.cs" />
<Compile Include="Interface\ICacheManager.cs" /> <Compile Include="Interface\ICacheManager.cs" />
<Compile Include="Entities\SugarMessageResult.cs" /> <Compile Include="Entities\SugarMessageResult.cs" />