CodeArts.Casting 是运行时类型操作框架,包含:类型转换、实体复制、实体映射相关功能。
-
类型转换(值类型、基元类型、字符串以及系统集合类型的相互装换)。
Mapper.Cast<Guid>("0bbd0503-4879-42de-8cf0-666537b642e2"); // 安全转换,转换失败时,返回默认值。 Mapper.ThrowsCast<Guid>("0bbd0503-4879-42de-8cf0-666537b642e2"); // 不安全转换,不能装换时,抛出异常。
-
实体复制(相同类型,或目标类型是源类型的基础接口或父类)。
public class CopyTest { public int Id { get; set; } public string Name { get; set; } } public class CopyToTest : CopyTest { public DateTime Date { get; set; } } var value = new CopyToTest { Id = 1000, Name = "test", Date = DateTime.Now }; // 同类型复制。 var copy1 = Mapper.Copy(value); // 父类型复制。 var copy2 = Mapper.Copy<CopyTest>(value);
-
实体映射(任意类型之间的转换)。
public class MapTest { public int Id { get; set; } public string Name { get; set; } } public class MapToTest { public int Id { get; set; } public string Name { get; set; } public DateTime Date { get; set; } } var value = new MapToTest { Id = 1000, Name = "test", Date = DateTime.Now }; // 不同类型的映射。 var map1 = Mapper.Map<MapTest>(value); // 相同类型映射(复制实体); var map2 = Mapper.Map<MapToTest>(value);
-
契约。
using System; namespace CodeArts.Casting { /// <summary> /// 拷贝配置。 /// </summary> public interface IProfileConfiguration { /// <summary> /// 类型创建器。 /// </summary> Func<Type, object> ServiceCtor { get; } /// <summary> /// 匹配模式。 /// </summary> PatternKind Kind { get; } /// <summary> /// 深度映射。 /// </summary> bool? IsDepthMapping { get; } /// <summary> /// 允许空目标值。 /// </summary> bool? AllowNullDestinationValues { get; } /// <summary> /// 允许空值传播映射。 /// </summary> bool? AllowNullPropagationMapping { get; } } }
-
说明。
- ServiceCtor:创建指定类型的实例。
- Kind:指定匹配模式,映射属性或字段。
- IsDepthMapping:是否深度映射(仅对自定义引用类型有效)。
- AllowNullDestinationValues:为false时,源值为null时,不做数据映射。
- AllowNullPropagationMapping:源值为null时,为目标值设置默认空值(仅对目标类型是string或Version有效)。
-
指定类型代理(任意源类型装换到指定目标类型的代理,仅最后一次指定有效)。
RuntimeServPools.Singleton<ICastToExpression, CastToExpression>() .Use((profile, type) => { if (type == typeof(Guid)) // 需要特殊处理的类型。 { return source => { var copy = (Guid)source; return copy.ToString("N"); }; } return profile.Create<string>(type); // 使用默认处理方式。 });
-
绝对类型代理(指定源类型到目标类型的代理)。
RuntimeServPools.Singleton<ICastToExpression, CastToExpression>() .Absolute<Guid, string>(source => source.ToString("N"));
-
约束类型代理(指定类型或指定类型的子类到目标类型的代理)。
RuntimeServPools.Singleton<IMapToExpression, MapToExpression>() .Run<IEnumerable<Guid>, List<Guid>>(source => { return new List<Guid>(source); });
-
条件约束代理(验证源类型是否可以代理到目标类型,如果能则调用解决方案)。
RuntimeServPools.Singleton<ICastToExpression, CastToExpression>() .Map(sourceType => sourceType.IsEnum, source => source.GetText());
- 属性映射属性,字段映射字段,不支持交替映射。
- 映射优先级:
- 相同名称。
- 相同的别名(
NamingAttribute
标记的名称)。 - 别名和名称相同。
- 指定类型代理优先于其它代理方式。