我需要编写一个方法,它接受任何对象并返回一个等价的对象,但如果该对象是引用类型,则在所有公共可写字符串属性/字段上应用html-encode。如果对象是一个字符串,它显然应该返回传递的字符串的html-encode。如果它是一个可枚举的类型,它应该枚举该类型,并对列表中的每一项应用与上面相同的逻辑。
这听起来可能吗?我一直在摆弄一些代码(使用ObjectDumper.cs作为起点),但还没能走得太远。
我的想法是,我可以将其作为一个方面应用到我的所有服务方法中,这样返回的对象字段就可以安全地绑定到html ui,这是由几个人处理的,他们有时会忘记在客户端触发编码。
发布于 2012-05-11 15:20:15
这听起来可能吗?
是的,但是最快和最糟糕的方法是使用反射,这将导致大量(30-100倍)的性能损失,而不是常规的属性调用。这对你可能重要,也可能无关紧要。
如果你选择反射路线,你可以:
通过在要使用Type.GetProperties()
PropertyInfo设置所有公共属性的实例上调用()来发现类型信息,以查看属性是否为字符串或可枚举值,以便从get对象获取访问器:GetGetMethod()PropertyInfo 对于IEnumerable,您需要做一些额外的工作,即通过后期绑定调用获取集合,然后枚举它。根据您的类型,您可能还需要忽略某些属性、修改字段等。
如果我必须这样做(我怀疑这是否是解决问题的正确方法),我会用反射扫描对象的接口一次,为每个属性创建dynamic getter/setter,并根据类型将它们缓存在字典中。随后处理对象的请求将使用这些缓存的方法,并实现与正常的get/set调用类似的性能。
枚举处理起来会有点麻烦,但如果您熟悉IL生成和/或expression trees,那么枚举是非常可行的。
是由几个人开发的,他们有时会忘记在客户端触发编码。
我认为代码应该被设计成让开发人员的生活更容易,但是你如何解释人们忘记了什么呢?我不反对防弹代码,但谁知道还会忘记什么呢。这只是个想法。
发布于 2018-08-23 22:55:01
使用反射对字符串属性进行编码。然后将响应对象强制转换为您的对象。
MyClass myObject = new MyClass();
myObject.propA = "string Value";
var response = EncodeProperties(myObject.getType(),myObject);
myObject = response as myObject ;
public static object EncodeProperties(Type type, object obj)
{
var propertiesInfo = type.GetProperties();
foreach (PropertyInfo p in propertiesInfo)
{
if (p.PropertyType.IsPrimitive
&& p.PropertyType.FullName == "System.String")
{
p.SetValue(obj, HttpUtility.HtmlEncode(value), null);
}
}
return obj;
}https://stackoverflow.com/questions/10546989
复制相似问题