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

.NET(Unity)安卓开发中使用反射获取公共属性是否可行?

在C#(Unity .NET Standard)中使用反射遍历公共属性的合理性

在C#(包括Unity的.NET Standard安卓开发环境)里,像你这样仅针对公共实例属性使用反射的做法是完全可行且合理的,不用像Java那样有过多顾虑,具体分析如下:

为什么这个做法是合适的

  • C#反射API的精准控制:你代码中指定的BindingFlags.Public | BindingFlags.Instance已经明确限定只获取类的公共实例属性,完全不会触及私有成员,这和Java中反射默认行为不同,完全符合你的需求。
  • 减少代码量的优势确实成立:如果后续TimingOld类新增公共的DateTime类型属性,这段代码不需要任何修改就能自动处理新属性,避免了手动编写逐个属性赋值/处理的重复代码,大幅提升维护效率。

需要注意的几个点

  • 性能优化:反射的调用速度确实比直接访问属性慢,但如果这个方法不是高频执行(比如不是每帧调用),安卓设备上的性能影响几乎可以忽略。如果担心高频调用的性能,可以缓存Type.GetProperties的结果,比如把获取到的PropertyInfo[]数组缓存到静态变量中,避免每次调用都重复获取:
    private static readonly PropertyInfo[] _timingOldDateTimeProps = typeof(TimingOld)
        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
        .Where(p => p.PropertyType == typeof(DateTime))
        .ToArray();
    
    private static Dictionary<string, DateTime> GetValuesOld(TimingOld timing)
    {
        return _timingOldDateTimeProps
            .OrderBy(t => t.GetValue(timing))
            .ToDictionary(t => t.Name, t => (DateTime)t.GetValue(timing));
    }
    
  • 类型安全校验:你当前代码用Convert.ToDateTime转换属性值,如果TimingOld里有非DateTime类型的公共属性,运行时会抛出异常。建议提前过滤出类型为DateTime的属性,既避免错误,也能提升效率(如上面优化后的代码)。
  • Unity AOT编译限制:安卓平台Unity默认是AOT编译,反射在这种环境下对具体类(比如你的TimingOld)的公共属性处理完全没问题,但要避免对泛型类的动态实例化等复杂反射操作,防止出现运行时错误。

你提供的原始代码

public static KeyValuePair<string, DateTime> IncomingTimingOld(TimingOld timing)
{
    Type type = typeof(TimingOld);
    Dictionary<string, DateTime> propValues = GetValuesOld(timing, type);
   //...
}

private static Dictionary<string, DateTime> GetValuesOld(TimingOld timing, Type type)
{
    // Get the public properties.
    return type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
        .OrderBy(t => t.GetValue(timing))
        .ToDictionary(t => t.Name, t => Convert.ToDateTime(t.GetValue(timing)));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:51:04