首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象的通用html编码

对象的通用html编码
EN

Stack Overflow用户
提问于 2012-05-11 15:09:08
回答 2查看 2.4K关注 0票数 1

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-11 15:20:15

这听起来可能吗?

是的,但是最快和最糟糕的方法是使用反射,这将导致大量(30-100倍)的性能损失,而不是常规的属性调用。这对你可能重要,也可能无关紧要。

如果你选择反射路线,你可以:

通过在要使用Type.GetProperties()

  • check PropertyInfo设置所有公共属性的实例上调用()来发现类型信息,以查看属性是否为字符串或可枚举值,以便从get对象获取访问器:GetGetMethod()
  • get
  • value
  • convert string
  • obtain PropertyInfo
  • 使用set访问器
  • 设置值

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

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

枚举处理起来会有点麻烦,但如果您熟悉IL生成和/或expression trees,那么枚举是非常可行的。

是由几个人开发的,他们有时会忘记在客户端触发编码。

我认为代码应该被设计成让开发人员的生活更容易,但是你如何解释人们忘记了什么呢?我不反对防弹代码,但谁知道还会忘记什么呢。这只是个想法。

票数 2
EN

Stack Overflow用户

发布于 2018-08-23 22:55:01

使用反射对字符串属性进行编码。然后将响应对象强制转换为您的对象。

代码语言:javascript
复制
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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10546989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档