🟥 关于asmdef、DLL的特殊注意事项
若你要反射的脚本所在的文件夹或上层节点中含有asmdef,此时调用反射代码会报如下错误:
ArgumentException: Type cannot be null.
你添加了Assembly Definition Reference,此时运行正常了。但如果你将C#文件打包成DLL,又会报上面的错误。
DLL不支持直接直接使用 Type.GetType。
因此不要尝试网上的教程了,直接按照本文的最终方案来吧。
🟧GetType多平台方法
private Type GetType(string typeName) { var type = Type.GetType(typeName); if (type != null) return type; foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) { type = a.GetType(typeName); if (type != null) return type; } return null; }
🟧反射属性
private void SetProperty(string className, string propertyName, object value) { //SKODE.Test:反射的类,如果有命名空间就需要加上。 Type tarClass = GetType("SKODE.Test"); Component tarComponent = gameObject.GetComponent(tarClass); PropertyInfo tarProperty = tarClass.GetProperty("hi", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); //将 tarComponent 组件的 tarProperty属性 设置为 true tarProperty.SetValue(tarComponent, true); }
🟨反射变量
private void SetField() { //SKODE.Test:反射的类,如果有命名空间就需要加上。 Type tarClass = GetType("SKODE.Test"); Component tarComponent = gameObject.GetComponent(tarClass); FieldInfo tarField = tarClass.GetField("hii", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); //将 tarComponent 组件的 tarField变量 设置为 true tarField.SetValue(tarComponent, true); }
🟩反射方法
private void CallMethod() { //SKODE.Test:反射的类,如果有命名空间就需要加上。 Type tarClass = GetType("SKODE.Test"); Component tarComponent = gameObject.GetComponent(tarClass); MethodInfo tarMethod = tarClass.GetMethod("Call", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); //调用 tarComponent 组件的 tarMethod方法,并传入参数 parameters。 //若不需要传入参数,则传入null即可。 object[] parameters = { true }; tarMethod.Invoke(tarComponent, parameters); }
🟦 反射重载方法
在反射重载方法时,如果调用此重载方法,会产生"发现不明确的匹配"的错误。
AmbiguousMatchException: Ambiguous match found.
解决方案如下:
GetMethod("MethodName", new Type [] { typeof(参数类型)});
其中type数组中的项的个数是由要调用的方法的参数个数来决定的。
如果无参数,则new Type[]{},使Type数组中的项个数为0。
1️⃣ 被调用的方法
2️⃣ 反射方法
private void CallVirtualMethod() { //Doozy.Runtime.UIManager.Containers.UIContainer:反射的类,如果有命名空间就需要加上。 Type tarClass = GetType("Doozy.Runtime.UIManager.Containers.UIContainer"); Component tarComponent = GetComponent(tarClass); MethodInfo tarMethod = tarClass.GetMethod("Hide", new Type[] { }); tarMethod.Invoke(tarComponent, null); }