module My const Here = My macro fieldsof(Texpr) T = eval(Texpr) names_and_types = zip(fieldnames(T), fieldtypes(T)) fields = (:($(esc(a))::$(esc(A))) for (a, A) in names_and_types) Expr(:block, fields...) end fieldsof(T) = macroexpand(Here, :(@fieldsof($T))) abstract type AbstractPerson end name(x::AbstractPerson) = x.name age(x::AbstractPerson) = x.age data(x::AbstractPerson) = x.data struct Person{T} <: AbstractPerson name::String age::Int data::T end abstract type AbstractStudent <: AbstractPerson end grade(x::AbstractStudent) = x.grade struct Student{T} <: AbstractStudent @fieldsof Person{:T} grade::Int end end My.fieldsof(My.Person{:T}) My.fieldsof(My.Person{:T}) |> Meta.show_sexpr p = My.Person("Ken", 28, "魔術師") @show My.name(p) @show My.age(p) @show My.data(p) ; My.fieldsof(My.Student{:T}) s = My.Student("Taro", 14, Dict("好き"=>"カレーライス", "嫌い"=>"ピーマン"), 8) @show My.name(s) @show My.age(s) @show My.data(s) @show My.grade(s) ;