You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中C#反射无法获取方法参数自定义属性的问题

Unity反射拿不到方法参数自定义属性?试试这些招

可能的坑和解决步骤

  • 先检查自定义属性的定义
    别漏了给TestAttrAttribute加[AttributeUsage(AttributeTargets.Parameter)],虽然默认支持参数,但显式指定能避免Unity编译器抽风。示例代码:

    [AttributeUsage(AttributeTargets.Parameter)]
    [UnityEngine.Scripting.Preserve]
    public class TestAttrAttribute : Attribute
    {
        // 你的属性逻辑
    }
    
  • 确认代码剥离真的关了
    别光说关了,再去Player Settings→Other Settings→Optimization里核对:

    • Managed Stripping Level设为Disabled
    • Strip Engine Code也得关掉
    • 如果用IL2CPP后端,把IL2CPP Code Generation的Optimization Level改成Debug,Release模式下IL2CPP会狠命优化,容易把属性剥没
  • 程序集编译设置别出错
    如果代码在自定义程序集(.asmdef文件)里,得勾选Preserve Compatibility;要是用默认的Assembly-CSharp,确认Api Compatibility Level是.NET Framework或者.NET Standard 2.1,别选.NET Core,Unity对它的反射支持有差异。

  • IL2CPP后端的特殊处理
    IL2CPP是出了名的爱剥东西,哪怕加了[Preserve]也可能没用:

    • 给包含TestMethod的类也加上[UnityEngine.Scripting.Preserve],别只给属性加
    • 给类加个空的静态构造函数,强制Unity保留反射信息:
      [UnityEngine.Scripting.Preserve]
      public static YourTestClass()
      {
          // 空构造就行,防止IL2CPP瞎优化
      }
      
    • 或者直接写Linker.xml(放Assets目录下),强制保留属性和方法:
      <linker>
        <assembly fullname="Assembly-CSharp">
          <type fullname="YourTestClass">
            <method name="TestMethod" />
          </type>
          <type fullname="TestAttrAttribute" preserve="all" />
        </assembly>
      </linker>
      
  • 编辑器模式下的缓存坑
    你是用MenuItem在编辑器里跑的,试试这些:

    • 右键Assets→Reimport All强制重新编译代码
    • 检查Edit→Project Settings→Editor→Script Compilation里的Scripting Runtime Version是不是.NET 4.x Equivalent
    • 实在不行就删Library目录(先备份项目!),让Unity重新生成缓存,编辑器缓存经常搞事情
  • 反射代码别写错了
    确认你获取ParameterInfo的方式没问题,示例代码:

    MethodInfo methodInfo = typeof(YourTestClass).GetMethod("TestMethod");
    ParameterInfo[] parameters = methodInfo.GetParameters();
    foreach (var param in parameters)
    {
        var attr = param.GetCustomAttribute<TestAttrAttribute>();
        if (attr != null)
        {
            // 处理属性
        }
    }
    

    如果是私有方法,记得加BindingFlags.Instance | BindingFlags.NonPublic,别漏了。

总结

Unity里反射拿不到参数属性,基本都是代码剥离、IL2CPP优化、编辑器缓存这几个锅,按上面的步骤挨个排查,尤其是IL2CPP的场景,显式配置Linker和正确使用Preserve特性是关键。

内容的提问来源于stack exchange,提问作者Darkgaze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:54:52