我有一个控件......任何 System.Windows.Forms.Control 。比如说。标签
我希望找到名为“Enabled”的属性的默认值(可以是任何属性)。我该怎么做?
1)在这种情况下,我们有一个标签。标签的“已启用”属性的默认值为true。
2)现在在运行时,假设我想找出属性“已启用”的默认值...我该如何找到?
3)首先,我有一个控制对象。从该对象,我只能获取属性“Enabled”的当前值,而不是DEFAULT值。
解决这个问题的一种可能方法是:
1)在运行时识别控件的类型。 2)使用其默认构造函数初始化它。 3)找到我们感兴趣的属性的值(它显然是默认值)并且那里......我们有默认值。
但是,在这种情况下......我不知道我的控制权。我所知道的是,它可以是 System.Windows.Forms.Control 的任何控制。那么我如何初始化它并获得它的对象呢?有可能吗?
您有其他解决方案/更好的方法吗?
答案 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);
但是,并非所有属性都使用此属性进行注释,因此并非所有默认值都可以通过这种方式获得。