You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:57:20