c#解决Nullable类型的转换 (包含DataContract的序列化和反序列化以及 该例子应用在反射属性setvalue的时候有用)
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace ConsoleApplication11
{
[DataContract]
public class XElementContainer
{
[DataMember]
public XElement member;
public XElementContainer()
{
member = XLinqTest.CreateXElement();
}
}
[DataContract]
public class XElementNullContainer
{
[DataMember]
public XElement member;
public XElementNullContainer()
{
member = null;
}
}
/* Copyright (c) 2014 Xiamen HaiHui Software Co., Ltd. All rights reserved
*
* Create by huanglc@holworth.com at 2014-10-14 10:09:18
*
*/
///<summary>
///交易日
///</summary>
[DataContract(Namespace = "Contract.Domain")]
public class Student
{
/// <summary>
/// 交易日ID
/// </summary>
//[DataMember]
//public virtual int? BusinessDateId
//{
// get;
// set;
//}
/// <summary>
/// 最新更新日
/// </summary>
[DataMember]
public virtual DateTime? AsOfDate
{
get;
set;
}
/// <summary>
/// 交易日期
/// </summary>
[DataMember]
public virtual DateTime? TransactionDate
{
get;
set;
}
/// <summary>
/// 营业日期
/// </summary>
[DataMember]
public virtual DateTime? ProcessDate
{
get;
set;
}
/// <summary>
/// 上传日期
/// </summary>
[DataMember]
public virtual DateTime? UploadDate
{
get;
set;
}
/// <summary>
/// 计算日期
/// </summary>
[DataMember]
public virtual DateTime? ComputeDate
{
get;
set;
}
/// <summary>
/// 输入日期
/// </summary>
[DataMember]
public virtual DateTime? InputDate
{
get;
set;
}
/// <summary>
/// 结算日期
/// </summary>
[DataMember]
public virtual DateTime? SettleDate
{
get;
set;
}
/// <summary>
/// 结束日期
/// </summary>
[DataMember]
public virtual DateTime? CloseDate
{
get;
set;
}
/// <summary>
/// 发布日期
/// </summary>
[DataMember]
public virtual DateTime? PostDate
{
get;
set;
}
/// <summary>
/// 提醒日期
/// </summary>
[DataMember]
public virtual DateTime? NoticeDate
{
get;
set;
}
/// <summary>
/// 当天日期
/// </summary>
[DataMember]
public virtual DateTime? CurrentDate
{
get;
set;
}
/// <summary>
/// 前一天日期
/// </summary>
[DataMember]
public virtual DateTime? PriorDate
{
get;
set;
}
}
public class XLinqTest
{
static void Main(string[] args)
{
// Test<XElement>(CreateXElement());
// Test<XElementContainer>(new XElementContainer());
// Test<XElementNullContainer>(new XElementNullContainer());
DateTime dt = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
Test<Student>(new Student() { AsOfDate=dt, CloseDate=dt, ComputeDate=dt, CurrentDate=dt, InputDate=dt, NoticeDate=dt, PostDate=dt, PriorDate=dt, ProcessDate=dt, SettleDate=dt, TransactionDate=dt, UploadDate=dt });
Console.ReadLine();
}
public static XElement CreateXElement()
{
return new XElement(XName.Get("NameInNamespace", "http://www.adventure-works.org"));
}
public static void Test<T>(T obj) where T:new()
{
DataContractSerializer s = new DataContractSerializer(typeof(T));
using (FileStream fs = File.Open("test" + typeof(T).Name + ".xml", FileMode.Create))
{
s.WriteObject(fs,obj);
}
using (FileStream fs=File.Open("test"+typeof(T).Name+".xml",FileMode.Open))
{
Object S2=s.ReadObject(fs);
Type type = S2.GetType();
PropertyInfo[] ps = type.GetProperties();
foreach (PropertyInfo p in ps)
{
string PropertyName = p.Name;
string PropertyValue = p.GetValue(S2).ToString();
Console.WriteLine(PropertyName+"\t"+PropertyValue);
}
T t = new T();
Console.WriteLine("赋值给新对象的值如下:\r\n");
foreach (PropertyInfo p in ps)
{
string PropertyName = p.Name;
string PropertyValue = p.GetValue(S2).ToString();
if (!p.PropertyType.IsGenericType)
{
p.SetValue(t, string.IsNullOrEmpty(PropertyValue) ? null : Convert.ChangeType(PropertyValue, p.PropertyType));
}
else
{
//泛型Nullable<>
Type genericTypeDefinition = p.PropertyType.GetGenericTypeDefinition();
if (genericTypeDefinition == typeof(Nullable<>))
{
p.SetValue(obj, string.IsNullOrEmpty(PropertyValue) ? null : Convert.ChangeType(PropertyValue, Nullable.GetUnderlyingType(p.PropertyType)));
}
}
}
PropertyInfo[] NewPropertyInfo = type.GetProperties();
foreach (PropertyInfo p in NewPropertyInfo)
{
string PropertyName = p.Name;
string PropertyValue = p.GetValue(S2).ToString();
Console.WriteLine(PropertyName + "\t" + PropertyValue);
}
if (S2 == null)
{
Console.WriteLine(" Deserialized object is null (Nothing in VB)");
}
else
{
Console.WriteLine(" Deserialized type: {0}", S2.GetType());
}
}
}
}
}
c#解决Nullable类型的转换 (包含DataContract的序列化和反序列化以及 该例子应用在反射属性setvalue的时候有用)的更多相关文章
- C# 序列化与反序列化之DataContract与xml对子类进行序列化的解决方案
C# 序列化与反序列化之DataContract与xml对子类进行序列化的解决方案 1.DataContract继承对子类进行序列化的解决方案 第一种是在 [DataContract, KnownTy ...
- json的序列化和反序列化支持时间格式转换
.NET自带的json序列有时间格式问题,为了解决自己写了个json格式的序列化和反序列化 1.引入的命名空间 using System; using System.Collections.Gener ...
- Convert.ChangeType不能处理Nullable类型的解决办法
在做一个ORMapping功能的时候发现,Convert.ChangeType不能处理nullable类型,比如int?. 解决办法也很简单,贴出完整的代码(大部分代码来自网络),注意下面代码没经过完 ...
- Convert.ChangeType不能处理Nullable类型的解决办法(转)
https://www.cnblogs.com/patrickyu/p/3211115.html 在做一个ORMapping功能的时候发现,Convert.ChangeType不能处理nullable ...
- 彻底解决Spring mvc中时间类型的转换和序列化问题
在使用Spring mvc 进行开发时我们经常遇到前端传来的某种格式的时间字符串无法用java8时间包下的具体类型参数来直接接收.同时还有一系列的序列化 .反序列化问题,在返回前端带时间类型的同样会出 ...
- DataTable转list时 可空类型的转换问题
public class UtilHelper { public static IList<T> ConvertTo<T>(DataTable table) { if (tab ...
- spring类型自动转换——@InitBinder和Converter
spring有2种类型转换器,一种是propertyEditor,一种是Converter.虽然都是类型转换,但是还是有细微差别. 所以这里以一个例子的形式来分析一下这2种类型转换的使用场景和差别. ...
- C#高级编程笔记 2016年10月8日运算符和类型强制转换
1.checked和unchecked 运算符 C#提供了checked 和uncheckde 运算符.如果把一个代码块标记为checked, CLR就会执行溢出检查,如果发生溢出,就抛出overfl ...
- [改善Java代码]不要让类型默默转换
建议23:不要让类型默默转换 public class Client { // 光速是30万公里/秒,常量 public static final int LIGHT_SPEED = 30 * 100 ...
随机推荐
- jqGrid使用json实现的范例一
qGrid 是一个用来显示网格数据的jQuery插件,通过使用jqGrid可以轻松实现前端页面与后台数据的ajax异步通信.文档比较全面,其官方网址为:http://www.trirand.com. ...
- 《DSP using MATLAB》示例 Example 9.14
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- java实现MsOffice文档向pdf文档转化
本篇文档实现功能,将word和ppt文档的文件转化成pdf格式的文档 应用到jacob 第一步:下载压缩包 (1)jacob官网下载jacob压缩包 (2)网址:http://sourceforge. ...
- hasura graphql 角色访问控制
目前从官方文档以及测试可以看出不加任何header的请求访问的是所有的数据,对于具有访问 控制的请求需要添加请求头,实际生产的使用需要集合web hook 的实现访问控制. 参考配置 访问请求 目前数 ...
- FastAdmin 升级后出现 is already in use
FastAdmin 升级后出现 is already in use 升级 FastAdmin 改进很多,但全新安装出现以下错误 Cannot use app\common\library\Menu a ...
- oracle 之 安装10.2.0.1 且 升级到 10.2.0.4
一. centos 6.5 安装 oracle 10.2.0.1 1.安装操作系统,选择桌面环境 2.配置本地yum源 , 可参考 http://blog.csdn.net/zhang12345645 ...
- django创建第一个项目helloworld
环境:centos 7,已安装python 3.6环境 1.安装django并创建django第一个项目 1.1.使用pip安装django# pip install Django或指定安装版本# p ...
- php在循环内外实例化类占用内存比较
关于php类的实例化和内存的关系,可以这么说:只要有一个new 关键字就是创建一个对象,创建一个对象就是在内存中分配了一个空间. 代码1: 在循环外实例化类:class ABC{ public $nu ...
- 归并排序算法-python实现
#-*- coding: UTF-8 -*- import numpy as np def Merge(a, f, m, l): i = f j = m + 1 tmp = [] while i &l ...
- Python笔试题&面试题总结
黑色加粗的是笔试题,蓝色是面试题 1.什么是GIL 2.Python中的@staticmethod和@classmethod的区别 (**) 3.Python里面如何拷贝一个对象,并解析深浅拷贝 4. ...