C# 将更改属性和INotify组合在一个函数中

C# 将更改属性和INotify组合在一个函数中,c#,reflection,caliburn.micro,C#,Reflection,Caliburn.micro,我有一个类似于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;

我有一个类似于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
}
它工作正常-我不需要将属性名作为字符串传递,这样我就可以自由更改属性名

但如果我能将我的电话从:

ChangeProperty(() => Property, ref property, value);
例如:

ChangeProperty(Property => property = value);
或者任何看起来更好的东西


有人有什么想法吗?

你可以这样做

ChangeProperty(()=>Property, value);

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

请查看CallerMemberNameTributor,它允许在不传递属性名称的情况下轻松实现OnPropertyChanged

还要注意,这需要.NET4.5或更高版本。@Euphoric,的确如此。但如果.NET4.5可用,它仍然是最好的本机解决方案。使用像PostSharp这样的AOP框架可以产生更好、更可读的结果solution@Euphoric-您不需要.NET 4.5。你需要一个C#5.0编译器。你的意思是你没有使用Caliburn.Micro,但是你想在你的代码中使用一个类似于他们的
ChangeProperty()
函数的函数吗?你可以将当前值存储在
字典中,而不使用私有字段或反射。
ChangeProperty(()=>Property, value);