获取属性信息

时间:2011-02-21 09:54:49

标签: c# reflection

我的UI是使用大量可翻译的用户控件构建的。不应翻译usercontrols中的某些控件,我想用[DoNotTranslate]`自定义属性标记它们。

在我的userControl.designer.cs文件中

    [DoNotTranslate] 
    private DevExpress.XtraEditors.LabelControl maxLabel;

    [DoNotTranslate]
    private DevExpress.XtraEditors.LabelControl valueLabel;

    //all other controls

翻译函数需要一个(用户)控件,然后遍历所有子control.Controls以确保所有控件都被翻译,而无需在每个控件上调用翻译函数。

是否可以找出控件是否设置了自定义属性?问题是当我浏览所有控件时,我看不到如何在翻译功能中获取属性信息。

非常感谢任何建议,

由于

2 个答案:

答案 0 :(得分:2)

编辑:我现在从您发布的代码中看到该属性位于控件的属性上,而不是定义控件本身的类。你可以尝试这样:

public IEnumerable<PropertyInfo> GetNonTranslatableProperties(WebControl control)
{
    foreach (PropertyInfo property in control.GetType().GetProperties())
    {
        if(
        property
        .GetCustomAttributes(true)
        .Count(item => item is DoNotTranslateAttribute) > 0)
            yield return property;
    }        
}

否则,您可以将Label子类化为NonTranslatableLabel,将该属性应用于该类,并在“父”控件中使用它而不是Label。

[NonTranslatable]
public class NonTranslatableLabel : Label

===================

您可以执行以下每个控件:

myCustomControl.GetType()
 .GetCustomAttributes(true)
 .Where(item => item is DoNotTranslateAttribute);
例如,您可以枚举所有“不可翻译”的控件,如下所示:

public IEnumerable<Control> GetNonTranslatableChildren(Control control)
{
    foreach(Control c in control.Controls) 
    {
        if(
        c.GetType()
        .GetCustomAttributes(true)
        .Count(item => item is DoNotTranslateAttribute) > 0)
            yield return c;
    }        
}

答案 1 :(得分:1)

您可以使用GetCustomAttributes方法查明该属性是否已应用。例如,

static readonly Type _DoNotTranslateAttribute = typeof(DoNotTranslate);

.... // other code

var t = control.GetType();
if (t.GetCustomAttributes(_DoNotTranslateAttribute, false).length > 0)
{
   // do not translate
}

(免责声明:未经测试/未编译的代码 - 只是为了了解如何使用该功能)