c#动态类型,及动态对象的创建,合并2个对象,map

在处理客户端请求数据时,经常需要将数据库中的int型数据转换为具象含义。本文探讨了如何在C#中使用动态类型、ExpandoObject和Reflection简化这一过程,避免编写大量DTO或Arg对象。介绍了一个简单的Map转换方法,以避免使用大型库如AutoMap或TinyMap,以简洁的方式实现动态对象合并和转换。并提供了一段测试代码作为示例。
摘要由CSDN通过智能技术生成

经常会遇到这样的情况,我们在响应客户端请求的数据的时候需要对数据进行处理,比如数据库中的数据是int型,它可能表示某个枚举,或者其它的逻辑意义(数据库这样的设计可能是从数据安全性、存储量上等角度考虑),但是客户端显示的时候需要是它具体的意义。这个时候我们的处理方式一般都是2中的,如果逻辑不复杂,且单一的话,直接修改sql语句就能处理好数据源,这个时候代码里面不需要处理什么。但是如果逻辑复稍许复杂或者判断的情况有很多分支,我们不得不从代码角度来处理了。单个对象还好,多个对象比如是个list<T>,那就要循环对某个对象的字段进行XXX了。进而衍生出了这就出现了DTO,Arg的中间对象,当然,我个人是很喜欢这样的设计的,但是某些时候也会偷懒不想写(多半情况我直接写代码生器批量生产),比如在测试的时候,在接私活的时候,在演示的时候,只为快速呈现想要的效果 都懒得去屑,是的,你会说市面上不是有很多的map库,比如automap,tinymap,甚至json.net里面的动态特性重写,方法当然很多,但用一个大轮子来费力搞这么个小事,我觉得划不来。且轮子越来越大它要干的事越多,我可不想搞的那么复杂,嗯,就是这样,写了个。具体的代码贴到下面,如果看明白,会很方便的扩展了或修改成自己想要的效果。

using System.Dynamic;
using System.Reflection;
using System.Collections.Concurrent;

private static readonly ConcurrentDictionary<RuntimeTypeHandle, PropertyInfo[]>
   DynamicObjectProperties = new ConcurrentDictionary<RuntimeTypeHandle, PropertyInfo[]>();

private IDictionary<string, Object> ToDynamicResult<T>(T classobj, Func<string, object, object> injectAct)
    where T : IInjectClass, new()
{
    var type = typeof(T);
    var key = type.TypeHandle;
    var dynamicResult = new ExpandoObject() as IDictionary<string, Object>;

    PropertyInfo[] queryPts = null;
    DynamicObjectProperties.TryGetValue(key, out queryPts);

    if (queryPts == null)
    {
        queryPts = type.GetProperties();
        DynamicObjectProperties.TryAdd(key, queryPts);
    }

    foreach (var p in queryPts)
    {
        var attributes = p.GetCustomAttributes(typeof(IngorePropertyAttribute), true);
        var columnMapping = attributes.FirstOrDefault();
        if (columnMapping != null) continue;

        var _name = p.Name;
        var _value = p.GetValue(classobj, null);
        object _tempvalue = _value;

        if (injectAct != null) _tempvalue = injectAct.Invoke(_name, _value);

        //var value = Convert.ChangeType(value,typeof(string));  
        dynamicResult.Add(p.Name, _tempvalue);
    }

    return dynamicResult;
}

/// <summary>
/// 支持动态输出的对象接口
/// </summary>
public interface IInjectClass
{
}
//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值