如何检索具有特定属性的所有字段?

时间:2014-08-25 09:05:18

标签: c# asp.net

我有一个表单翻译器,它遍历页面的控件集合,并翻译任何包含存储在数据库中的当前文化的新短语的文本。但事实证明这还不够。我还需要能够翻译存储在字段中的字符串。为此,我想用一个名为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?

检索这些列表

2 个答案:

答案 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.");