gpt4 book ai didi

c# - 此代码如何处理 INotifyPropertyChanged

转载 作者:行者123 更新时间:2023-11-30 22:36:46 28 4
gpt4 key购买 nike

我在此链接中看到以下代码:An elegant way to implement INotifyPropertyChanged

我是表达式树的新手。谁能解释一下这段代码是如何简单工作的?

谢谢

private string _name;
public string Name
{
get { return _name; }
set { PropertyChanged.ChangeAndNotify(ref _name, value, () => Name); }
}

public static bool ChangeAndNotify<T>(this PropertyChangedEventHandler handler,ref T field, T value, Expression<Func<T>> memberExpression)
{
if (memberExpression == null)
{
throw new ArgumentNullException("memberExpression");
}
var body = memberExpression.Body as MemberExpression;
if (body == null)
{
throw new ArgumentException("Lambda must return a property.");
}
if (EqualityComparer<T>.Default.Equals(field, value))
{
return false;
}

var vmExpression = body.Expression as ConstantExpression;
if (vmExpression != null)
{
LambdaExpression lambda = Expression.Lambda(vmExpression);
Delegate vmFunc = lambda.Compile();
object sender = vmFunc.DynamicInvoke();

if (handler != null)
{
handler(sender, new PropertyChangedEventArgs(body.Member.Name));
}
}

field = value;
return true;
}

最佳答案

表达式树是表达式在运行时的面向对象表示。 C# 编译器可以自动将表达式的有限子集 编写为Expression<>实例,通过 lambda - 即

Func<string> anonMethod = () => "abc"; // this is a delegate
Expression<Func<string>> expression = () => "abc"; // this is an expression

上面会有一个ConstantExpression ;您的示例将有一个 ConstantExpression捕获 this和一个 MemberExpression包装常量 ( this ) 和成员 ( .Name )。然后在运行时,它定位 MemberExpression , 它有一个 MemberInfo , 它有一个 Name .它甚至可以有一个 ConstantExpression到一个捕获类,一个MemberExpressionthis (作为捕获类的一个字段),然后 MemberExpression.Name .

差异很细微,但可以在运行时拆分和检查表达式 - 这对于 LINQ 至关重要。然而:虽然编译器可以编写这些,但它们不能自由检查;他们也有成本。

IMO,也许坚持:

public string Name
{
get { return _name; }
set { SomeSimpleNotifyMethod(ref _name, value, this, "Name"; }
}

这更简单、更快(很明显,更改方法以获取传递给事件的字符串)。

关于c# - 此代码如何处理 INotifyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829099/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com