Aar*_*ron 53 .net c# attributes properties
我听说有人说这个DefaultValue
属性有几个不同的东西,包括:
哪个(如果有的话)是对的?DefaultValue
实际上是否设置了默认值?是否有不起作用的情况?最好不要使用它吗?
STW*_*STW 54
我通常使用的地方DefaultValue
是用于序列化/反序列化为XML的类.它不会在实例化期间设置默认值,也不会影响autoproperties.
来自MSDN:
DefaultValueAttribute不会导致使用属性的值自动初始化成员.您必须在代码中设置初始值.
编辑:正如Roland指出的那样,正如其他人在答案中提到的那样,表单设计器也使用了该属性
Joh*_*ton 17
要在四年后更新:目前,设置JSON.net的DefaultValueHandling参数使DefaultValue按照@aaron预期的方式工作:
[JsonProperty("allowUploading",DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]
[DefaultValue(true)]
public bool AllowUploading { get; set; }
Run Code Online (Sandbox Code Playgroud)
Row*_*haw 12
像所有属性一样,它是元数据,因此"它仅用于装饰.您必须手动设置实际默认值." 是最接近的.
MSDN继续谈到DefaultValueAttribute:
DefaultValueAttribute不会导致使用属性的值自动初始化成员.您必须在代码中设置初始值.
即,您仍然需要使构造函数与您所说的默认值匹配,以便信任它的代码仍然有效,例如内置的XML序列化将使用它们来确定是否序列化属性; 类似地,表单设计者将使用DefaultValue
s来计算出需要自动生成的代码.
小智 10
你实际上可以"强迫"它很容易在任何类上工作.
首先,您需要在System命名空间中编写对象扩展方法:
public static class ObjectExtensions
{
public static void InitializePropertyDefaultValues(this object obj)
{
PropertyInfo[] props = obj.GetType().GetProperties();
foreach (PropertyInfo prop in props)
{
var d = prop.GetCustomAttribute<DefaultValueAttribute>();
if (d != null)
prop.SetValue(obj, d.Value);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在类的构造函数中,在类的层次结构中足够高,实际上需要这样的自动默认值初始化,您只需要添加一行:
public MotherOfMyClasses()
{
this.InitializePropertyDefaultValues();
}
Run Code Online (Sandbox Code Playgroud)
在最新版本的 中C#
,您可以执行以下操作:
public class InitParam
{
public const int MyInt_Default = 32;
public const bool MyBool_Default = true;
[DefaultValue(MyInt_Default)]
public int MyInt{ get; set; } = MyInt_Default;
[DefaultValue(MyBool_Default)]
public bool MyBool{ get; set; } = MyBool_Default;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
35869 次 |
最近记录: |