使用ClearScript封装linkify.js时,如何抑制匿名类型的无关成员?
解决ClearScript给linkify.js传attributes时多余成员的问题
这里有几个实用方案可以解决你遇到的.NET成员暴露问题:
方案1:用ExpandoObject替代匿名类型
ExpandoObject本质是动态字典,ClearScript会把它当作原生JS对象处理,不会附带.NET Object的额外成员。直接构造你需要的属性即可:
// 构造自定义属性 var linkAttributes = new ExpandoObject(); linkAttributes["class"] = "custom-link"; linkAttributes["data-source"] = "linkify-wrapper"; // 传入linkifyHtml的options var options = new { attributes = linkAttributes }; // 调用linkifyHtml引擎方法 scriptEngine.Invoke("linkifyHtml", htmlContent, options);
方案2:给自定义类型添加ClearScript特性标记
如果想用强类型,给自定义类加上ScriptType和ScriptMember特性,明确指定只暴露你需要的属性:
[ScriptType(ScriptMemberFlags.ExposePropertiesOnly)] public class LinkifyAttributes { [ScriptMember] public string Class { get; set; } [ScriptMember(Name = "data-id")] // 支持短横线命名的属性 public string DataId { get; set; } } // 使用时直接实例化赋值 var attributes = new LinkifyAttributes { Class = "styled-link", DataId = "1001" };
这个配置会让ClearScript只暴露标记了ScriptMember的属性,自动过滤掉.NET的ToString、toJSON以及$前缀的成员。
方案3:用DynamicObject手动控制成员枚举
如果需要更灵活的控制,可以继承DynamicObject,自己管理要暴露的属性集合:
public class CustomAttributeContainer : DynamicObject { private readonly Dictionary<string, object> _props = new(); public void SetProperty(string key, object value) => _props[key] = value; // 只返回我们添加的属性名 public override IEnumerable<string> GetDynamicMemberNames() => _props.Keys; // 处理属性获取 public override bool TryGetMember(GetMemberBinder binder, out object result) { return _props.TryGetValue(binder.Name, out result); } } // 使用示例 var attributes = new CustomAttributeContainer(); attributes.SetProperty("class", "dynamic-link"); attributes.SetProperty("data-timestamp", DateTime.UtcNow.Ticks);
这种方式完全由你控制哪些成员会被ClearScript暴露给JS引擎,彻底杜绝多余属性的问题。
内容的提问来源于stack exchange,提问作者ElektroStudios
相关产品推荐
相关产品推荐

