首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当属性为null时设置默认值

问当属性为null时设置默认值
EN

Stack Overflow用户
提问于 2016-08-19 10:49:03
回答 2查看 9.5K关注 0票数 1

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

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

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

这是我的密码:

代码语言:javascript
复制
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的例子:

代码语言:javascript
复制
<TextBox Grid.Row="1" Grid.Column="1"
         Style="{StaticResource TextBoxStyle}"
         Text="{Binding ExamplePropertie,
                Mode=TwoWay,
                UpdateSourceTrigger=PropertyChanged}"/>

对于每个绑定元素,我都想这样做:

代码语言:javascript
复制
[DefaultValue("default")]
public String ExamplePropertie
{
    get
    {
        return _myProp;
    }
    set
    {
        if (value == null)
            default(ExamplePropertie); // Not working
        else
            _myProp = value;
        OnPropertyChanged(nameof(ExamplePropertie));
    }
}

但是default(ExamplePropertie)并不是这样做的好方法。如何设置用[DefaultValue(value)]定义的值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-19 11:06:31

[DefaultValue(...)]是一个属性。不能通过将default(...)应用于属性的名称来获取其值。这个过程更复杂:您需要为您的属性获取PropertyInfo对象,查询它以获得DefaultValueAttribute类型的自定义属性,然后从它获取值。

使用助手方法,这个过程要简单得多:

代码语言:javascript
复制
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;
}

将此助手方法放入单独的类中,并按以下方式使用:

代码语言:javascript
复制
_myProp = value ?? Helper.GetDefaultValue<string>(this, nameof(ExampleProperty));

注意: foreach循环在SetDefault中可以简化如下:

代码语言:javascript
复制
foreach (object box in actualItem.Children.OfType<TextBox>()) {
    box.Text = null;
}
票数 1
EN

Stack Overflow用户

发布于 2016-08-19 10:54:35

那么,您可以求助于反射来获取该属性的值,但更简单的方法是将默认值存储为const:

代码语言:javascript
复制
private const string ExamplePropertieDefault = "default";

[DefaultValue(ExamplePropertieDefault)]
public String ExamplePropertie
{
    get
    {
        return _myProp;
    }
    set
    {
        if (value == null)
            ExamplePropertieDefault;
        else
            _myProp = value;
        OnPropertyChanged(nameof(ExamplePropertie));
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39037153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档