查找包含部分令牌的所有标识符
Finding all identifiers containing part of the token
我知道我可以使用
从资源中获取字符串
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" 和 "posn.brokenose")。我希望能够添加到 posn 元素的列表中,所以我无法真正存储句点之后的部分列表。我也不能为此使用字符串数组(具体原因意味着我不能这样做)。
有没有一种方法可以在对 return id 的 getidentifer 调用中使用类似于 "posn.*" 的东西?
您可以使用一些反射 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
.
我知道我可以使用
从资源中获取字符串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" 和 "posn.brokenose")。我希望能够添加到 posn 元素的列表中,所以我无法真正存储句点之后的部分列表。我也不能为此使用字符串数组(具体原因意味着我不能这样做)。
有没有一种方法可以在对 return id 的 getidentifer 调用中使用类似于 "posn.*" 的东西?
您可以使用一些反射 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
.