【发布时间】:2017-04-10 14:27:23
【问题描述】:
当我尝试运行以下代码时,mi.Invoke 行出现错误,提示“TargetException:对象与目标类型不匹配。”
我在 SO 上看到了其他答案,他们都说 Invoke 的第一个参数是“this”而不是类型本身存在问题,这里不是这种情况。
MethodInfo 创建行和调用行都使用相同的变量“type2”,但它表示它们是不同的。如何解决此错误?
//In this example VoxelType is "ConveyorBelt". This is a class with a public Update method, in the same namespace.
Type type2 = getTypeByName (VoxelType)[0]; //Get voxel type
print (type2.Namespace); //Returns null
print (VoxelType); //Returns ConveyorBelt
print (type2);//Returns ConveyorBelt
MethodInfo mi = type2.GetMethod ("Update");
mi.Invoke (type2, null); //Crashes everytime with TargetException
【问题讨论】:
-
仅供参考:在 Unity 中确实没有理由这样做。您只是在为游戏引擎编写组件。老实说,它永远不会起作用!
-
可以想象你在这个之后:stackoverflow.com/a/36249404/294884希望它有帮助
-
但是你为什么要使用反射调用更新函数呢?另外,你的
getTypeByName函数在哪里? -
我正在编写一个系统,以便更轻松地向基于 Minecraft 的游戏添加额外的块。要添加一个额外的块,在“Voxels”文件夹中创建一个新文件夹,其中包含一堆艺术资产,以及一个与该块同名的新 c# 文件。当 unity 加载游戏时,它会加载所有这些文件。当主体素类为每个块更新时,它需要从该块名称的相关 c# 文件中找出更新时要做什么。因此,它会在命名空间中搜索与该块相关的 c# 文件,并从文件中运行 Update 方法。这意味着没有 -->
-
--> 普通代码被更改以添加额外的块。
标签: c# unity3d reflection