将属性和INotify组合在一个函数中

时间:2013-10-25 10:54:52

标签: 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;
    propertyRef = newValue;
    PropertyChangeEx(this, propertyName, oldValue, newValue); // change event
}

我这样用它:

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

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

但如果我可以改变我的电话会很好:

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

类似于:

ChangeProperty(Property => property = value);

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

有没有人有想法?

2 个答案:

答案 0 :(得分:1)

您可以执行类似

的操作
ChangeProperty(()=>Property, value);

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

答案 1 :(得分:1)

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