如何阻止PropertyInfo.SetValue移除开头的换行符?
解决反射设置属性时开头换行符被移除的问题
哦,这个情况我之前碰到过!大概率不是SetValue方法本身的问题,而是你要设置的propName属性的setter方法内部自动做了去除首尾空白(比如Trim)的处理。给你梳理下排查和解决的思路:
先去检查
myObjectType对应的类里,propName属性的定义。比如如果它的setter是这样写的:private string _propName; public string PropName { get => _propName; set => _propName = value?.Trim(); // 这里的Trim会把开头的换行符也干掉 }那不管你是直接赋值还是用反射,开头的换行都会被去掉——因为setter在接收值的时候就处理了。
针对这种情况,有两种可行的解决方法:
绕过属性setter,直接给字段赋值:
如果类里的对应字段是存在的(比如上面的_propName),你可以直接通过反射获取私有字段,然后赋值,这样就能跳过setter的Trim逻辑:// 注意要指定BindingFlags来获取私有实例字段 FieldInfo fieldInfo = myObjectType.GetField("_propName", BindingFlags.Instance | BindingFlags.NonPublic); fieldInfo.SetValue(myObject, "\n some text");记得把
_propName换成你类里实际的字段名哦。修改属性的setter逻辑:
如果你有权限修改这个类的代码,那直接调整setter的处理就好——比如把Trim()改成只去除空格,或者干脆去掉:// 只去除空格,保留换行符 set => _propName = value?.Trim(' '); // 或者直接不做处理 set => _propName = value;
还有一种小概率情况:如果
propName不是原生的string类型,而是某个自定义的字符串包装类,那可能是这个自定义类型的赋值逻辑处理了换行符,这时候就得去看这个类型的实现代码,找到对应的处理逻辑调整。
总的来说,核心就是找到换行符被干掉的源头——基本就是属性setter或者字段的处理逻辑,针对这个源头调整就能保留开头的换行符啦。
内容的提问来源于stack exchange,提问作者Que Dee
相关产品推荐
相关产品推荐

