oop - 使用反射调用方法并返回值

标签 oop reflection methods go

使用关于 calling a method by name 的问题作为起点,我想通过名称调用一个方法,并实际对该值执行一些操作。

package main

import "fmt"
import "reflect"

type T struct{}

func (t *T) Foo() {
    fmt.Println("foo")
}

type MyStruct struct {
    id int
}

type Person struct {
    Name string
    Age  int
}

func (t *T) Bar(ms *MyStruct, p *Person) int {
    return p.Age

}

func main() {
    var t *T
    reflect.ValueOf(t).MethodByName("Foo").Call([]reflect.Value{})
    var ans int
    ans = reflect.ValueOf(t).MethodByName("Bar").Call([]reflect.Value{reflect.ValueOf(&MyStruct{15}), reflect.    ValueOf(&Person{"Dexter", 15})})
}

Playground link, http://play.golang.org/p/e02-KpdQ_P

但是,我收到以下错误:

prog.go:30: cannot use reflect.ValueOf(t).MethodByName("Bar").Call([]reflect.Value literal) (type []reflect.Value) as type int in assignment
 [process exited with non-zero status] 

我应该采取什么不同的做法才能实际返回值?我尝试使用类型转换并将其设为 int,但编译器表示它不能 []reflect.Value

最佳答案

Call 返回 []reflect.Value,它是一个 slice 。您需要从 slice 中获取一个元素才能进行类型转换。拥有 reflect.Value 实例后,您可以调用 Int() 来获取 int64 形式的值。

var ans int64
ans = reflect.ValueOf(t).MethodByName("Bar").Call([]reflect.Value{
    reflect.ValueOf(&MyStruct{15}), 
    reflect.ValueOf(&Person{"Dexter", 15})})[0].Int()
fmt.Println(ans)

Playground

关于oop - 使用反射调用方法并返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21594097/

相关文章:

.net - 在哪里可以找到过程代码转换为目标代码的示例

java - Java中如何判断类成员是否是静态成员和字段

c# - 仅通过提供字符串名称获取属性

ruby - 为什么 `next` 没有列为 `Enumerator` 类的方法?

python-3.x - 如何在 Python 3.7.x 中使用带有 @dataclass 的 list[customClass] 作为类型

没有接口(interface)的 C# 插件模式

oop - 可以应用 Liskov 替换原则(php 示例)吗?

C# 昂贵的方法调用? Assembly.GetEntryAssembly() 和 Assembly.GetCallingAssembly()

java - 如何控制Activity方法流直到非Activity类执行网络操作

c# - 有什么简单的方法可以在 C# 中创建方法并动态设置其主体吗?