public void DefaultUpdateSetValueMethod(PropertyDefinition propertyDesc, CodeMemberMethod setvalueMethod) { //Type fieldRealType; //fieldRealType = Type.GetType(field.Type.BaseType, false); var setValueStatement = new CodeConditionStatement( new CodeMethodInvokeExpression( WXMLCodeDomGeneratorHelper.GetFieldNameReferenceExpression(propertyDesc), "Equals", new CodeVariableReferenceExpression("fieldName")) ); var fieldName = new WXMLCodeDomGeneratorNameHelper(Settings).GetPrivateMemberName(propertyDesc.Name); //setValueStatement.TrueStatements.Add( // new CodeVariableDeclarationStatement(typeof(IConvertible), "vConv", // new Codety) // ); //old: simple cast //setValueStatement.TrueStatements.Add(new CodeAssignStatement( // new CodeFieldReferenceExpression( // new CodeThisReferenceExpression(), field.Name), // new CodeCastExpression(field.Type, // new CodeArgumentReferenceExpression( // "value")))); // new: solves problem of direct casts with Nullable<> if (propertyDesc.PropertyType.IsNullableType && propertyDesc.PropertyType.IsClrType && propertyDesc.PropertyType.ClrType.GetGenericArguments()[0].IsValueType && !propertyDesc.PropertyType.ClrType.GetGenericArguments()[0].Equals(typeof(Guid)) && !propertyDesc.PropertyType.ClrType.GetGenericArguments()[0].Equals(typeof(TimeSpan))) { setValueStatement.TrueStatements.Add( //new CodeVariableDeclarationStatement(typeof(IConvertible), "iconvVal", // CodePatternAsExpression(new CodeTypeReference(typeof(IConvertible)), // new CodeArgumentReferenceExpression("value"))) Emit.declare("iconvVal", () => LinqToCodedom.Generator.CodeDom.VarRef("value") as IConvertible) ); setValueStatement.TrueStatements.Add( new CodeConditionStatement( new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("iconvVal"), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(null)), new CodeStatement[] { new CodeAssignStatement( new CodeFieldReferenceExpression( new CodeThisReferenceExpression(), fieldName), new CodeCastExpression(propertyDesc.PropertyType.ToCodeType(Settings), new CodeArgumentReferenceExpression( "value"))) }, new CodeStatement[] { //System.Threading.Thread.CurrentThread.CurrentCulture new CodeAssignStatement( new CodeFieldReferenceExpression( new CodeThisReferenceExpression(), fieldName), new CodeMethodInvokeExpression( new CodeVariableReferenceExpression("iconvVal"), "To" + propertyDesc.PropertyType.ClrType.GetGenericArguments()[0].Name, new CodePropertyReferenceExpression( new CodePropertyReferenceExpression( new CodeTypeReferenceExpression(typeof(System.Threading.Thread)), "CurrentThread" ), "CurrentCulture" ) ) ) } ) ); } else if (propertyDesc.PropertyType.IsEnum) { setValueStatement.TrueStatements.Add( Emit.@ifelse((object value) => LinqToCodedom.Generator.CodeDom.Is(value, null), /* true statements */ new[] { Emit.assignField(fieldName, (object value) => LinqToCodedom.Generator.CodeDom.@default(propertyDesc.PropertyType.ToCodeType(Settings))) }, /* false statements */ Emit.assignField(fieldName, (object value) => LinqToCodedom.Generator.CodeDom.cast(propertyDesc.PropertyType.ToCodeType(Settings), LinqToCodedom.Generator.CodeDom.Call <object>(LinqToCodedom.Generator.CodeDom.MethodRef(typeof(Enum), "ToObject"))(new CodeTypeOfExpression(propertyDesc.PropertyType.ToCodeType(Settings)), value) )) ) ); } else if (propertyDesc.PropertyType.IsValueType && (!propertyDesc.PropertyType.IsNullableType || !(propertyDesc.PropertyType.IsClrType && (propertyDesc.PropertyType.ClrType.GetGenericArguments()[0].Equals(typeof(Guid)) || propertyDesc.PropertyType.ClrType.GetGenericArguments()[0].Equals(typeof(TimeSpan)))))) { //old: simple cast //setValueStatement.TrueStatements.Add(new CodeAssignStatement( // new CodeFieldReferenceExpression( // new CodeThisReferenceExpression(), fieldName), // new CodeCastExpression(propertyDesc.PropertyType.ToCodeType(Settings), // new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(new CodeTypeReference(typeof(Convert))), "ChangeType", // new CodeArgumentReferenceExpression("value"), new CodeTypeOfExpression(propertyDesc.PropertyType.ToCodeType(Settings)))))); setValueStatement.TrueStatements.Add( Emit.@ifelse((object value) => LinqToCodedom.Generator.CodeDom.Is(value, null), /* true statements */ new [] { Emit.assignField(fieldName, (object value) => LinqToCodedom.Generator.CodeDom.@default(propertyDesc.PropertyType.ToCodeType(Settings))) }, /* false statements */ Emit.assignField(fieldName, (object value) => LinqToCodedom.Generator.CodeDom.cast(propertyDesc.PropertyType.ToCodeType(Settings), LinqToCodedom.Generator.CodeDom.Call <object>("Convert.ChangeType")(value, new CodeTypeOfExpression(propertyDesc.PropertyType.ToCodeType(Settings))) )) ) ); } else { setValueStatement.TrueStatements.Add(new CodeAssignStatement( new CodeFieldReferenceExpression( new CodeThisReferenceExpression(), fieldName), new CodeCastExpression(propertyDesc.PropertyType.ToCodeType(Settings), new CodeArgumentReferenceExpression("value")))); } setValueStatement.TrueStatements.Add(new CodeMethodReturnStatement()); setvalueMethod.Statements.Add(setValueStatement); }