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

时间:2015-05-19 08:45:00

标签: c# android xamarin.android

我知道我可以使用

从资源中获取字符串

df <- structure(list(df1 = c(1L, 0L), df2 = 1:2, df3 = c(9L, 5L), df4 = 1:2, df5 = c(0L, 0L), df6 = 1:2), .Names = c("df1", "df2", "df3", "df4", "df5", "df6"), class = "data.frame", row.names = c(NA, -2L))

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

我知道如果我的元素被称为foo_1,foo_2,foo_3,那么我可以使用像

这样的东西迭代并抓取字符串
Resources.GetIdentifier(token, "string", ctx.ApplicationContext.PackageName)

我的问题是我的令牌名称都以&#34; posn开头。&#34; (posn可以表示任何东西的位置,所以你可以拥有&#34; posn.left_arm&#34;和#34; posn.brokenose&#34;)。我希望能够添加到posn元素列表中,因此我无法在句点之后存储部分列表。我也不能使用字符串数组(具体原因意味着我不能这样做)。

有没有办法可以使用类似于&#34; posn。*&#34;在getidentifer调用中返回id?

1 个答案:

答案 0 :(得分:0)

你可以使用一些反射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