以类型安全的方式处理PropertyChanged

kpo*_*zin 8 c# silverlight events inotifypropertychanged

有很多文章关于如何使用反射和LINQ以类型安全的方式引发PropertyChanged事件,而不使用字符串.

但有没有办法以类型安全的方式使用 PropertyChanged事件?目前,我正在这样做

void model_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case "Property1":
            ...
        case "Property2":
            ...

        ....               
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法避免在switch语句中对字符串进行硬编码来处理不同的属性?一些类似LINQ或基于反射的方法?

小智 6

在 C# 6.0 中,您可以使用nameof。您还可以在不创建该类的实例的情况下引用类的属性。

void model_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case nameof(ClassName.Property1):
            ...
        case nameof(ClassName.Property2):
            ...

        ....               
    }
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*mwi 4

让\xe2\x80\x99s 声明一个可以将 lambda 表达式转换为 ReflectionPropertyInfo对象的方法(摘自我的答案):

\n\n
public static PropertyInfo GetProperty<T>(Expression<Func<T>> expr)\n{\n    var member = expr.Body as MemberExpression;\n    if (member == null)\n        throw new InvalidOperationException("Expression is not a member access expression.");\n    var property = member.Member as PropertyInfo;\n    if (property == null)\n        throw new InvalidOperationException("Member in expression is not a property.");\n    return property;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后让\xe2\x80\x99s 使用它来获取属性的名称:

\n\n
void model_PropertyChanged(object sender, PropertyChangedEventArgs e)\n{\n    if (e.PropertyName == GetProperty(() => Property1).Name)\n    {\n        // ...\n    }\n    else if (e.PropertyName == GetProperty(() => Property2).Name)\n    {\n        // ...\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

不幸的是,您不能\xe2\x80\x99 使用switch语句,因为属性名称不再是编译时常量。

\n