.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
相关产品推荐
相关产品推荐

