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)
让\xe2\x80\x99s 声明一个可以将 lambda 表达式转换为 ReflectionPropertyInfo对象的方法(摘自我的答案):
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}\nRun Code Online (Sandbox Code Playgroud)\n\n然后让\xe2\x80\x99s 使用它来获取属性的名称:
\n\nvoid 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}\nRun Code Online (Sandbox Code Playgroud)\n\n不幸的是,您不能\xe2\x80\x99 使用switch语句,因为属性名称不再是编译时常量。
| 归档时间: |
|
| 查看次数: |
3717 次 |
| 最近记录: |