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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:45:03