如何在TLSharp中获取联系人电话号码列表?是否有除反射外的实现方法?
替代实现方案
方案1:直接访问属性(最优推荐)
如果你的项目可以直接访问User类的公开Phone属性,完全不需要用反射,直接读写属性即可,性能最高、代码最易维护:
var userContacts = await client.GetContactsAsync(); // 直接用LINQ筛选转换即可 var listPhones = userContacts.Users .Where(u => u.Phone != null) .Select(u => u.Phone.ToString()) .ToList();
方案2:动态类型简化非公开属性访问
如果你拿不到User类的定义,或者Phone是非公开属性,不想写复杂的反射代码,可以用dynamic简化写法:
var userContacts = await client.GetContactsAsync(); foreach (dynamic user in userContacts.Users) { try { if (user.Phone != null) { listPhones.Add(user.Phone.ToString()); } } catch (RuntimeBinderException) { // 当对象不存在Phone属性时跳过,避免程序崩溃 continue; } }
方案3:优化反射写法
如果必须用反射实现,你原来的写法每次遍历用户都要全量查一次属性列表,性能浪费很大,可以缓存属性信息只查一次:
// 提前获取Phone属性的反射信息,只执行一次 var phoneProperty = userContacts.Users.GetType().GenericTypeArguments[0].GetProperty("Phone"); if (phoneProperty == null) { // 可在这里处理不存在Phone属性的异常逻辑 return; } var userContacts = await client.GetContactsAsync(); foreach (var user in userContacts.Users) { var phoneValue = phoneProperty.GetValue(user); if (phoneValue != null) { listPhones.Add(phoneValue.ToString()); } }
方案选择建议
- 能直接访问
Phone属性优先选方案1,无额外性能开销 - 无法访问属性定义的场景,优先选方案2,代码简洁易读
- 不适合用动态类型的场景(比如要兼容.NET Framework 3.5及以下版本)选方案3,性能比你原有的反射写法高很多,尤其联系人数量较多时差异明显。
内容的提问来源于stack exchange,提问作者nexus
相关产品推荐
相关产品推荐

