C# 为空时设置属性的默认值

C# 为空时设置属性的默认值,c#,default-value,C#,Default Value,我正在尝试定义一种方法来设置C#中属性的默认值 我有很多元素文本框和一个按钮来恢复默认值。我希望当用户单击按钮时,TextBox的内容设置为默认值 我的想法是将值设置为null,在setter中检查值,如果值为null,则设置默认值 这是我的代码: private void SetDefault() { Grid actualItem = tabControl.SelectedContent as Grid; if (actualItem != null) {

我正在尝试定义一种方法来设置C#中属性的默认值

我有很多元素文本框和一个按钮来恢复默认值。我希望当用户单击按钮时,TextBox的内容设置为默认值

我的想法是将值设置为null,在setter中检查值,如果值为null,则设置默认值

这是我的代码:

private void SetDefault()
{
    Grid actualItem = tabControl.SelectedContent as Grid;
    if (actualItem != null)
    {
        foreach (object elt in actualItem.Children)
        {
            if (elt.GetType() == typeof(TextBox))
            {
                TextBox box = elt as TextBox;
                box.Text = null;
            }
        }
    }
}
文本框示例:

<TextBox Grid.Row="1" Grid.Column="1"
         Style="{StaticResource TextBoxStyle}"
         Text="{Binding ExamplePropertie,
                Mode=TwoWay,
                UpdateSourceTrigger=PropertyChanged}"/>

但是
default(例如property)
并不是实现这一点的好方法。如何设置用
[DefaultValue(value)]
定义的值?

好吧,您可以通过反射来获取该属性的值,但更简单的方法是将默认值存储为常量:

private const string ExamplePropertieDefault = "default";

[DefaultValue(ExamplePropertieDefault)]
public String ExamplePropertie
{
    get
    {
        return _myProp;
    }
    set
    {
        if (value == null)
            ExamplePropertieDefault;
        else
            _myProp = value;
        OnPropertyChanged(nameof(ExamplePropertie));
    }
}
[DefaultValue(…)]
是一个属性。您无法通过将
default(…)
应用于属性的名称来获取其值。这个过程更复杂:您需要获取属性的
PropertyInfo
对象,查询它以获得类型为
DefaultValueAttribute
的自定义属性,然后从中获取值

使用帮助器方法,该过程变得更容易:

static T GetDefaultValue<T>(object obj, string propertyName) {
    if (obj == null) return default(T);
    var prop = obj.GetType().GetProperty(propertyName);
    if (prop == null) return default(T);
    var attr = prop.GetCustomAttributes(typeof(DefaultValueAttribute), true);
    if (attr.Length != 1) return default(T);
    return (T)((DefaultValueAttribute)attr[0]).Value;
}

您应该在属性旁边引入一个
const
值,并在setter的属性和代码中使用它。您的代码没有使用绑定,而是直接为文本框赋值。数据绑定意味着您告诉控件在哪里查找数据。您正在构建什么样的应用程序?例如,在WPF中,您可以在绑定表达式中指定默认值。代码
default(ExampleProperty)
仅获取该
类型的默认值,对于任何引用类型,该值始终为
null
DefaultValue
属性与该属性无关。@LasseV.Karlsen因此我必须按属性编写一个常量?@PanagiotisKanavos我添加了带有绑定的部分,它位于WPF的视图中。我来看看你的解决方案。在这种情况下,[DefaultValue()]是没有用的,不是吗?你为什么这么说?你知道DefaultValueAttribute做什么吗?它被序列化程序之类的东西用来通过省略具有默认值的属性来优化输出。序列化程序知道可以安全省略的方式是,该属性的值与DefaultValueAttribute中指定的值相同。所以不,它不是无用的。对你来说可能没必要,但只有你知道。好吧,我不知道这些。那我就留着吧。感谢您的解释。
obj.GetProperty(propertyName)
不编译,但使用
obj.GetType().GetProperty(propertyName)
效果很好!我不知道
的类型
谢谢你的提示!
static T GetDefaultValue<T>(object obj, string propertyName) {
    if (obj == null) return default(T);
    var prop = obj.GetType().GetProperty(propertyName);
    if (prop == null) return default(T);
    var attr = prop.GetCustomAttributes(typeof(DefaultValueAttribute), true);
    if (attr.Length != 1) return default(T);
    return (T)((DefaultValueAttribute)attr[0]).Value;
}
_myProp = value ?? Helper.GetDefaultValue<string>(this, nameof(ExampleProperty));
foreach (object box in actualItem.Children.OfType<TextBox>()) {
    box.Text = null;
}