1

我需要编写一个方法,该方法接受任何对象并返回等效对象,但如果对象是引用类型,则在所有公共可写字符串属性/字段上应用 html-encode。如果对象是一个字符串,它显然应该返回传递的字符串的 html-encode。如果它是可枚举类型,它应该枚举该类型并对列表中的每个项目应用与上述相同的逻辑。

这听起来可能吗?我一直在玩弄一些代码(使用 ObjectDumper.cs 作为起点),但还没有走多远。

这个想法是我可以将它作为一个方面应用到我的所有服务方法中,这样返回的对象字段就可以安全地与 html ui 绑定,这由几个有时忘记触发客户端上的编码的人正在研究边。

4

2 回答 2

2

这听起来可能吗?

是的,但是快速而肮脏的方法是使用反射,与常规属性调用相比,这将导致巨大的(30-100 倍)性能损失。这对您可能很重要,也可能无关紧要。

如果你走反射路线,你可以:

  • 通过在要修改的实例上调用 GetType() 来发现类型信息
  • 使用Type.GetProperties()发现所有公共属性
  • 检查PropertyInfo属性是字符串还是可枚举字符串
  • PropertyInfo从对象获取 get 访问器:GetGetMethod()
  • 获取价值
  • 转换价值
  • 使用 set 访问器设置值GetSetMethod()

对于IEnumerable,您需要做一些额外的工作,即通过后期绑定调用获取集合,然后枚举它。根据您的类型,您可能还需要忽略某些属性、修改字段等。

如果我必须这样做(并且我怀疑这是否是解决问题的正确方法),我将使用反射扫描对象的接口一次,并为每个属性创建动态getter/setter 并将它们缓存在基于 Dictionary 的在类型上。随后处理对象的请求将使用这些缓存的方法并实现类似于正常 get/set 调用的性能。

如果您熟悉 IL 生成和/或表达式树,则枚举处理起来会有点麻烦,但非常可行。

几个人正在研究这个问题,他们有时会忘记在客户端触发编码。

我认为代码的设计应该让开发人员的生活更轻松,但你怎么能解释人们忘记了什么?我不反对防弹代码,但谁知道还有什么会被遗忘。只是一个想法。

于 2012-05-11T07:20:15.407 回答
0

使用反射对字符串属性进行编码。然后将响应对象投射到您的对象。

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;
    }
于 2018-08-23T14:55:00.853 回答