5

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

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

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

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

3)首先我有一个我可以控制的对象。从该对象中,我只能获取属性“已启用”的当前值,但不能获取默认值。

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

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

但是,在这种情况下..我事先不知道我的控制权。我所知道的是,它可以是来自System.Windows.Forms.Control的任何控件。那么我如何初始化它并获取它的对象呢?是否可以?

您有任何替代解决方案/更好的方法吗?

4

4 回答 4

4

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

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[] { });
}

请注意,如果您使用大量控件执行此操作,其中可能有多个单一类型,您可能希望缓存每种类型的结果,因为反射有点慢。

于 2012-06-22T13:37:36.937 回答
3

您可以使用泛型实例化(在设计时)未知对象。

public class DefaultValueChecker<T> where T : System.Windows.Forms.Control, new()
{
    public bool DetermineDefaultValue() {
        var control = new T();
        return control.Enabled;
    }
}
于 2012-06-22T13:30:02.843 回答
0

这个一般是查不出来的。默认值可以是以下之一:

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

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

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

于 2012-06-22T13:30:05.170 回答
0

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

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

但是,并不是所有的属性都标注了这个属性,所以并不是所有的默认值都可以通过这种方式获取。

于 2012-06-22T13:46:31.903 回答