//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权(除特别声明外的代码)归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
// 使用文档:https://thingsgateway.cn/
// QQ群:605534569
//------------------------------------------------------------------------------
using System.Dynamic; // 引入 System.Dynamic 命名空间
using System.Reflection;
namespace ThingsGateway.Foundation.Extension.Dynamic;
///
/// 提供对动态类型的扩展方法
///
public static class ExpandoObjectExtensions
{
///
/// 将动态对象转换为指定类型实体
///
/// 动态对象
/// 要转换的目标实体类型
///
/// 转换后的实体对象
public static object ConvertToEntity(this ExpandoObject expandoObject, Type type, Dictionary properties)
{
var entity = Activator.CreateInstance(type);
// 遍历动态对象的属性
expandoObject.ForEach(keyValuePair =>
{
// 检查动态对象的属性是否存在于目标类型的属性中
if (properties.TryGetValue(keyValuePair.Key, out var property))
{
var value = keyValuePair.Value; // 获取动态属性的值
// 将动态属性值转换为目标属性类型并设置到目标对象的属性中
property.SetValue(entity, ThingsGatewayStringConverter.Default.Deserialize(null, value?.ToString(), property.PropertyType));
}
});
return entity; // 返回转换后的实体对象
}
///
/// 将动态对象转换为指定类型实体
///
/// 要转换的目标实体类型
/// 动态对象
///
/// 转换后的实体对象
public static T ConvertToEntity(this ExpandoObject expandoObject, Dictionary properties) where T : new()
{
var entity = new T(); // 创建目标类型的实例
// 遍历动态对象的属性
expandoObject.ForEach(keyValuePair =>
{
// 检查动态对象的属性是否存在于目标类型的属性中
if (properties.TryGetValue(keyValuePair.Key, out var property))
{
var value = keyValuePair.Value; // 获取动态属性的值
// 将动态属性值转换为目标属性类型并设置到目标对象的属性中
property.SetValue(entity, ThingsGatewayStringConverter.Default.Deserialize(null, value?.ToString(), property.PropertyType));
}
});
return entity; // 返回转换后的实体对象
}
/////
///// 获取动态对象中指定属性的值
/////
///// 动态对象的类型
///// 动态对象
///// 要获取值的属性名称
///// 属性的值
//public static object GetProperty(this ExpandoObject expandoObject, string propertyName)
//{
// var type = typeof(T); // 获取动态对象的类型
// var properties = type.GetRuntimeProperties(); // 获取动态对象的所有属性
// var propertyDes = type.GetPropertyDisplayName(propertyName); // 获取指定属性的描述名称
// return expandoObject.FirstOrDefault(a => a.Key == propertyDes).Value; // 返回指定属性的值
//}
}