如何在C#中在运行时查找控件的默认属性值

时间:2012-06-22 13:24:17

标签: c# .net

我有一个控件......任何 System.Windows.Forms.Control 。比如说。标签

我希望找到名为“Enabled”的属性的默认值(可以是任何属性)。我该怎么做?

1)在这种情况下,我们有一个标签。标签的“已启用”属性的默认值为true。

2)现在在运行时,假设我想找出属性“已启用”的默认值...我该如何找到?

3)首先,我有一个控制对象。从该对象,我只能获取属性“Enabled”的当前值,而不是DEFAULT值。

解决这个问题的一种可能方法是:

1)在运行时识别控件的类型。 2)使用其默认构造函数初始化它。 3)找到我们感兴趣的属性的值(它显然是默认值)并且那里......我们有默认值。

但是,在这种情况下......我不知道我的控制权。我所知道的是,它可以是 System.Windows.Forms.Control 的任何控制。那么我如何初始化它并获得它的对象呢?有可能吗?

您有其他解决方案/更好的方法吗?

4 个答案:

答案 0 :(得分:4)

这是使用反射的好机会!这是一个方法,它应该为任何具有默认构造函数(public,no parameters)的类型获取任何属性的默认值:

public static object GetDefaultPropertyValue(Type type, string propertyName)
{
        if (type.GetConstructor(new Type[] { }) == null)
            throw new Exception(type + " doesn't have a default constructor, so there is no default instance to get a default property value from.");
        var obj = Activator.CreateInstance(type);
        return type.GetProperty(propertyName).GetValue(obj, new object[] { });
}

请注意,如果您使用大量可能存在单个类型的倍数的控件执行此操作,则可能需要缓存每种类型的结果,因为反射有点慢。

答案 1 :(得分:3)

您可以使用泛型来设置(在设计时)未知对象。

public class DefaultValueChecker<T> where T : System.Windows.Forms.Control, new()
{
    public bool DetermineDefaultValue() {
        var control = new T();
        return control.Enabled;
    }
}

答案 2 :(得分:0)

这一般无法找到。默认值可以是以下之一:

  • 硬编码
  • 依赖(可交换)资源
  • 取决于系统设置

使用您建议的方法,您最多可以找到硬编码值。但是,您无法确定它们是否真的是硬编码。

至于问题的第二部分,这可以通过使用反射来解决:查看Type类(运行时类型信息)和Activator类(运行时类型实例化)。

答案 3 :(得分:0)

您可以尝试使用反射并检查DefaultValue属性:

Type labelType = typeof(Label);
DefaultValueAttribute attr = (DefaultValueAttribute)labelType
    .GetProperty("AutoEllipsis")
    .GetCustomAttributes(typeof(Defaul tValueAttribute),true)
    .FirstOrDefault();
Console.WriteLine(attr.Value);

但是,并非所有属性都使用此属性进行注释,因此并非所有默认值都可以通过这种方式获得。