0

我有一个看起来类似于的函数Caliburn.Micro

// using Caliburn.Micro;
public void ChangeProperty<T>(Expression<Func<T>> property, ref T propertyRef, T newValue)
{
    string propertyName = property.GetMemberInfo().Name;
    T oldValue = propertyRef;
    propertyRef = newValue;
    PropertyChangeEx(this, propertyName, oldValue, newValue); // change event
}

我像这样使用它:

public Property
{
    get { return property; }
    set { ChangeProperty(() => Property, ref property, value); }
}

它工作正常 - 我不需要将属性名称作为字符串传递,因此我可以自由更改属性的名称。

但如果我能改变我的电话,那就太好了:

ChangeProperty(() => Property, ref property, value);

类似于:

ChangeProperty(Property => property = value);

或任何看起来更好的东西。

有人有想法吗?

4

2 回答 2

1

你可以做类似的事情

ChangeProperty(()=>Property, value);

在内部,您可以使用名称约定从属性名称中获取字段名称,然后使用反射来设置该字段。但是反射可能会影响性能,并且名称约定可能会改变。此外,在低信任环境中,您不能使用反射来操作私有字段。

于 2013-10-25T11:00:34.983 回答
1

看看 CallerMemberNameAttribure,它允许在不传递属性名称的情况下轻松实现 OnPropertyChanged。http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute.aspx

于 2013-10-25T11:02:39.140 回答