06d插件模板自动解序化

原文
插件模板自动生成样板代码,并复制粘贴插件语句处.它是全功能的,可以用静如串插件.我们来试试自动生成解序化函数.

class PersonClass
{
    private
    {
        string name;
        int age;
        PersonType type;
    }

    this()
    {
    }

    this(string name, int age, PersonType type)
    {
        this.name = name;
        this.age = age;
        this.type = type;
    }

    override string toString()
    {
        import std.format : format;
        return "我是%s,%s岁,是个%s.".format(this.name, this.age, this.type);
    }
}

创建插件模板

插件模板AutoStaticDeserialise(自动静解序化).

mixin template AutoStaticDeserialise()
{
}
//可在`括号`中定义`模板参数`.

使用方法:

class PersonClass
{
    mixin AutoStaticDeserialise;
    //省略...
}

测试有意思插件模板性质:

mixin template AutoStaticDeserialise()
{
    private alias ThisType = typeof(this);
    pragma(msg, ThisType);
}

class PersonClass
{
    mixin AutoStaticDeserialise;

    private
    {
        string name;
        //省略
    }
    // 略...
}

/*
    输出:  
        PersonClass
*/

插件模板复制粘贴进去的.我们甚至可访问被插件里面的私有成员.当作C++就差不多了.

加编译时检查

我们的解序化仅适用,且要求默认构造函数.我们加些静断.

mixin template AutoStaticDeserialise()
{
    private alias ThisType = typeof(this);
    static assert(is(ThisType == class), "仅对类");
    static assert(HasDefaultCtor!ThisType, "要求有默认构造函数");
}

完整版:

mixin template AutoStaticDeserialise()
{
    ...//前三行如上,略
    public static ThisType deserialise(JSONValue json)
    {
        if(json.type == JSONType.null_)
        {//无效类
            return null;
        }

        auto instance = new ThisType();//实例

        static foreach(member; ThisType.tupleof)
        {{
            alias MemberType = typeof(member);
            const MemberName = __traits(identifier, member);

            MemberType memberValue = json[MemberName].deserialise!MemberType();
            mixin("instance." ~ MemberName ~ " = memberValue;");
        }}//静态解序化.

        return instance;
    }
}

测试:

void main()
{
    import std.stdio : writeln;

    auto person = new PersonClass("Bradley", 21, PersonType.Student);
    writeln(deserialise!PersonClass(parseJSON(`{ "name": "Bradley", "age": 21, "type": "Student" }`)));
}

/*
    输出:
        我是Bradley,21岁,我是Student.
*/
posted @   zjh6  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示