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 [email protected] 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());
}

}

}
}
}

时间: 2024-10-14 08:22:15

c#解决Nullable类型的转换 (包含DataContract的序列化和反序列化以及 该例子应用在反射属性setvalue的时候有用)的相关文章

“System.Nullable&lt;System.DateTime&gt;”不包含“ToShortDateString”的定义,并且找不到可接受类型

在做MVC项目时,有如下代码: <asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server"><h2>Upcoming Dinners</h2><ul><% foreach (var dinner in Model) { %><li><%=Html.Encode(dinner.Title

Convert.ChangeType不能处理Nullable类型的解决办法(转)

https://www.cnblogs.com/patrickyu/p/3211115.html 在做一个ORMapping功能的时候发现,Convert.ChangeType不能处理nullable类型,比如int?. 解决办法也很简单,贴出完整的代码(大部分代码来自网络),注意下面代码没经过完整测试,不要直接用在项目里: public delegate void SetValue<T>(T value); public static class ORMapping<T> whe

在C#中使用 Nullable 类型

在C#1.x的版本中,一个值类型变量是不可以被赋予null值的,否则会产生异常.在C#2.0中,微软提供了Nullable类型,允许用它定义包含null值(即空值)的数据类型,这对处理数据库中包含可选字段以及很多方面都有很大帮助. 定义Nullable类型 定义一个nullable类型非常类似于定义一个非nullable类型.不同之处在于使用类型修饰符“?”.比如定义一个整型如下: int myInt = 1; 要使一个整型变量可以存储一个null值,可以如下声明: int? myNullabl

【读书笔记】C#高级编程 第七章 运算符和类型强制转换

(一)运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ -- 移位运算符 << >> 比较运算符 == != < > <= >= 赋值运算符 = += -= *= /= %= &= |= ^= <<= >>= 成员访问运算符(用于对象和结构) . 索引运算符(用于数组和索引器) [] 类型转换运算符 () 条件

PHP类型转换&amp;&amp;类型强制转换

获取数据类型 : 如果想查看某个表达式的值和类型,用 var_dump(). 如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype(). 要查看某个类型,不要用 gettype(),而用 is_type() 函数. ■字符串转换为数值 当一个字符串被当作数字来求值时,根据以下规则来决定结果的类型和值. 如果包括“.”,“e”或“E”其中任何一个字符的话,字符串被当作 float 来求值.否则就被当作整数. 该值由字符串最前面的部分决定.如果字符串以合法的数字数据开始,就用该数字作

《C#高级编程》【第7章】运算符与类型强制转换 -- 学习笔记

       运算符编程语言的基本元素,它使得我们的代码更加的简洁明了.然而我们为了解决操作数类型不同的问题,我们又有引入了强制转换的概念.我们先看看本章的内容构成吧. 1.运算符 我们来看看一些常见的运算符: <1>条件运算符 其语法如下: Condition ? true_Expression : false_Expression 当条件Condition为真时,其将执行true_Expression,否则执行false_Expression. <2> checked 和

javascript 操作符类型隐性转换

(一).一元操作符只能操作一个值的操作符叫做一元操作符1.递增和递减操作符a. 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作.字符串变量变成数值变量.eg: var a='1'; ++a;  //a 变成2b.在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN,字符串变量变成数值变量.eg:var a='1aa';++a  //a 变成NaNc:在应用于布尔值false时,先将其转换为0再执行加减1的操作.布尔值变量变成数值变量.eg:var a=

.Net平台下实例类型无法转换成接口类型?

首先这种情况出现在应用程序启动前的方法里面. 本想通过发射来实现一些功能.谁知道被这个坑了. 碰到这种问题.已经相当无语了.同时也不知道该如何解决.望有能之士帮忙解答 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别

msdn参考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx http://msdn.microsoft.com/zh-cn/library/z5z9kes2.aspx http://msdn.microsoft.com/zh-cn/library/xhbhezf4.aspx operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转