我有一个表单翻译器,它遍历页面的控件集合,并翻译任何包含存储在数据库中的当前文化的新短语的文本。但事实证明这还不够。我还需要能够翻译存储在字段中的字符串。为此,我想用一个名为Localizable的新自定义属性注释这些字符串:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyProject.Business.BusinessHelp
{
public class Localizable : Attribute
{
}
}
可以这样使用:
[Localizable]
public string articles = "articles";
[Localizable]
public string summary = "summary";
(当然,在许多不可本地化的领域中)
那么如何在运行时使用Page或Page.Form?
检索这些列表答案 0 :(得分:1)
您无法通过查找属性来获取所有字段。但是,您可以遍历所有字段并检查每个字段是否具有该属性。
foreach(FieldInfo f in typeof(SomeClass).GetFields()){
if (f.GetCustomAttributes().Any(t=>t is LocalizableAttribute)) {
var name = f.Name; //this is how you get the field name
....
}
}
答案 1 :(得分:1)
您正在使用字段,所以它会是这样的:
using System.Reflection;
Type outputType = Type.GetType("MyNamespace.MyClass, MyAssembly");
IEnumerable<FieldInfo> fields = outputType.GetFields().Where(
p => p.GetCustomAttribute(typeof(Localizable)) != null);
因此fields
枚举仅包含具有FieldInfo
属性的Localizable
集合。如果您要使用属性,则需要使用GetProperties()
代替GetFields()
。
然后,只要您想要修改具有Localizable
属性的字段,就可以执行以下操作:
MyClass mc = new MyClass();
fields.First(x=>x.Name == "articles").SetValue(mc, "Das ist ein Artikel.");