自动截取Entity实体属性中字符串超长字符

因为项目中有部分接口是通过WCF暴露的,所以需要对每一个返回来的数据进行检查(通常其他类型都会在客户端完成验证,而字符串长度必须在服务端控制),特设计的一种通用针对字符串超长的处理实现;

大概思路是:

1.通过反射先获取实体中所有为String类型的属性;

2.根据实体属性名称查找实体元数据中的属性;

3.查找属性中包含MaxLength的参数;

4.通过反射获取属性值;

5.根据MaxLength值截取超长的字符串;

6.再通过反射将属性设置为更改后的值;

Code:

 

复制代码

        
/// <summary>
        
/// 自动截取实体对象属性中字符串最大长度
        
/// </summary>
        
/// <param name="entitySet">实体集</param>
        
/// <typeparam name="T">实体对象类型</typeparam>
        
/// <param name="model">实体对象</param>
        
/// <returns></returns>
        public T SubStringMaxLength<T>(EntitySet entitySet,T model) where T : EntityObject
        {
            Type t 
= model.GetType();
            
// 1.先获取所有实体中为String类型的属性;
            var arrProperty = t.GetProperties().Where(p=>p.PropertyType == typeof(string));
            
//循环遍历属性
            foreach (var property in arrProperty)
            {
                    
string propertyName = property.Name;
                    
// 2.根据实体属性名称查找实体元数据中的属性
                    EdmProperty edmproperty = entitySet.ElementType.Properties.First(p => p.Name == propertyName);
                    
if (edmproperty != null)
                    {
                        
// 3.查找属性中包含MaxLength的参数
                        Facet facLength = edmproperty.TypeUsage.Facets.First(p => p.Name == "MaxLength");
                        
if (facLength != null) ;
                        {
                            
int maxLength = Convert.ToInt32(facLength.Value);
                            
//  4.通过反射获取属性值
                            object objValue = property.GetValue(model, null);
                            
if (objValue != null)
                            {
                                
// 5.根据MaxLength值截取超长的字符串(保留左边字符)
                                string value = StringHelper.SubstringLeft(objValue.ToString(), maxLength);
                                
// 6.再通过反射将属性设置为更改后的值
                                if (!string.IsNullOrEmpty(value))
                                    property.SetValue(model, value, 
null);
                            }
                        }
                }
            }
            
return model;
        }
复制代码

 

 

本例只是提供一种思路;前提是概念模型中的MaxLength值必须和数据库中长度值一致;这种方案可能会影响一点点性能,但可以减少不是代码开发量;

 

Demo下载:https://files.cnblogs.com/yizhuqing/AutoSubstringEntityAttr.rar

posted on   木子清  阅读(1535)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了

导航

< 2010年10月 >
26 27 28 29 30 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 1 2 3 4 5 6

统计

我的网站:道道工作室
点击右上角即可分享
微信分享提示