对象的通用html编码

时间:2012-05-11 07:09:08

标签: c# html-encode

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

这听起来有可能吗?我一直在玩一些代码(使用ObjectDumper.cs作为起点)但是还没有达到目的。

我的想法是,然后我可以将其作为一个方面应用于我的所有服务方法,这样返回的对象字段可以安全地与html ui绑定,这有些人有时会忘记触发编码在客户端。

2 个答案:

答案 0 :(得分:1)

  

这听起来有可能吗?

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

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

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

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

如果我必须这样做(我怀疑这是否是解决问题的正确方法),我会用反射扫描对象的界面一次,并为每个属性创建dynamic个getter / setter并根据类型将它们缓存在Dictionary中。然后,处理对象的后续请求将使用这些缓存的方法,并实现与正常的get / set调用类似的性能。

如果您熟悉IL生成和/或expression trees,枚举将会遇到一些麻烦,但是非常可行。

  

正在被一些有时会忘记的人所处理   在客户端触发编码。

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

答案 1 :(得分: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;
    }