首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C#中有没有一种方法可以将属性转换为包含其名称的字符串?

在C#中有没有一种方法可以将属性转换为包含其名称的字符串?
EN

Stack Overflow用户
提问于 2013-08-01 16:46:18
回答 4查看 163关注 0票数 1

我希望在给定属性的情况下获得字符串表示。这样,我就可以将这个字符串用于NotifyPropertyChanged,并且在重构属性名称之后仍然可以正常工作。

编辑:我使用的是.NET 4.0

更新:我还希望DependencyProprty的名称可用,即我需要在静态变量赋值时使用该值。

相同的示例代码来解释:

代码语言:javascript
代码运行次数:0
运行
复制
// actual code

private int prop = 42;
public int Prop
{
    get
    {
        return prop;
    }
    set
    {
        prop = value;
        NotifyPropertyChanged("Prop"); // I'd like to replace the hard-coded string here
    }
}


// code as I'd like it to be

private int propNew = 42;
private static readonly string PropNewName = GainStringFromPropertySomeHow(PropNew); // should be "PropNew"
public int PropNew
{
    get
    {
        return propNew;
    }
    set
    {
        propNew = value;
        NotifyPropertyChanged(PropNewName); // <== will remain correct even if PropNew name is changed
    }
}

重构后:

代码语言:javascript
代码运行次数:0
运行
复制
private int prop = 42;
public int PropNameChanged
{
    get
    {
        return prop;
    }
    set
    {
        prop = value;
        NotifyPropertyChanged("Prop"); // oops
    }
}


private int propNew = 42;
private static readonly string PropNewName = GainStringFromPropertySomeHow(PropNewNameChanged); // should be "PropNewNameChanged"
public int PropNewNameChanged
{
    get
    {
        return propNew;
    }
    set
    {
        propNew = value;
        NotifyPropertyChanged(PropNewName); // still correct
    }
}
EN

回答 4

Stack Overflow用户

发布于 2013-08-01 16:54:59

我认为这可能是有帮助的:

代码语言:javascript
代码运行次数:0
运行
复制
// This method is called by the Set accessor of each property.
// The CallerMemberName attribute that is applied to the optional propertyName
// parameter causes the property name of the caller to be substituted as an argument.
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

来源和更多解释:http://msdn.microsoft.com/de-de/library/system.componentmodel.inotifypropertychanged.aspx

这里:http://msdn.microsoft.com/de-de/library/system.runtime.compilerservices.callermembernameattribute.aspx

票数 1
EN

Stack Overflow用户

发布于 2013-08-01 17:05:00

如果您还没有使用.Net 4.5,因此不能使用CallerMemberName,您可以使用以下方法:https://stackoverflow.com/a/3191598/869250

票数 1
EN

Stack Overflow用户

发布于 2013-08-01 17:05:19

这是How to get current property name via reflection?的副本

所以你可以这样做

代码语言:javascript
代码运行次数:0
运行
复制
NotifyPropertyChanged(MethodBase.GetCurrentMethod().Name);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17989201

复制
相关文章

相似问题

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