查找包含部分令牌的所有标识符

本文关键字:标识符 令牌 包含部 查找 | 更新日期: 2023-09-27 17:49:45

我知道我可以使用

从资源中获取字符串

Resources.GetIdentifier(token, "string", ctx.ApplicationContext.PackageName)

(抱歉,这是在c#中,它是Xamarin的一部分。Android项目)。

我知道如果我的元素名为foo_1, foo_2, foo_3,那么我可以迭代并获取字符串使用类似

var myList = new List<string>();
for(var i = 0; i < 4; ++i)
{
     var id = AppContent.GetIdentifier(token + i.ToString(), "string", "package_name");
     if (id != 0)
        myList.Add(AppContext.GetString(id));
}

我的问题是我的令牌名称都以"posn"开头。(posn可以表示任何东西的位置,所以你可以用"posn"。Left_arm"answers"posn.brokenose")。我想要向列表中添加元素,所以我不能存储周期之后的部分列表。我也不能为此使用字符串数组(具体原因意味着我不能这样做)。

有没有一种方法可以让我使用类似于"posn"的东西。在getidentider调用中返回id ?

查找包含部分令牌的所有标识符

您可以使用一些反射foo来得到您想要的。它一点也不漂亮,但它有效。反射的东西是基于https://gist.github.com/atsushieno/4e66da6e492dfb6c1dd0

private List<string> _stringNames;
private IEnumerable<int> GetIdentifiers(string contains)
{
    if (_stringNames == null)
    {
        var eass = Assembly.GetExecutingAssembly();
        Func<Assembly, Type> f = ass =>
            ass.GetCustomAttributes(typeof(ResourceDesignerAttribute), true)
                .OfType<ResourceDesignerAttribute>()
                .Where(ca => ca.IsApplication)
                .Select(ca => ass.GetType(ca.FullName))
                .FirstOrDefault(ty => ty != null);
        var t = f(eass) ??
            AppDomain.CurrentDomain.GetAssemblies().Select(ass => f(ass)).FirstOrDefault(ty => ty != null);
        if (t != null)
        {
            var strings = t.GetNestedTypes().FirstOrDefault(n => n.Name == "String");
            if (strings != null)
            {
                var fields = strings.GetFields();
                _stringNames = new List<string>();
                foreach (var field in fields)
                {
                    _stringNames.Add(field.Name);
                }
            }
        }
    }
    if (_stringNames != null)
    {
        var names = _stringNames.Where(s => s.Contains(contains));
        foreach (var name in names)
        {
            yield return Resources.GetIdentifier(name, "string", ComponentName.PackageName);
        }
    }
}

那么在你的Activity中你可以这样做:

var ids = GetIdentifiers("action").ToList();

这将给你所有的String资源,其中包含字符串action