gpt4 book ai didi

c# - 在 setter 中确定调用者——或静默设置属性

转载 作者:可可西里 更新时间:2023-11-01 08:37:43 24 4
gpt4 key购买 nike

给定标准 View 模型实现,当属性更改时,是否有任何方法可以确定更改的发起者?换句话说,在下面的 View 模型中,我希望“PropertyChanged”事件的“sender”参数是调用 Prop1 setter 的实际对象:

public class ViewModel : INotifyPropertyChanged
{
public double Prop1
{
get { return _prop1; }
set
{
if (_prop1 == value)
return;
_prop1 = value;

// here, can I determine the sender?
RaisePropertyChanged(propertyName: "Prop1", sender: this);
}
}
private double _prop1;

// TODO implement INotifyPropertyChanged
}

或者,是否可以将 CallerMemberNameAttribute 应用于属性 setter ?

最佳答案

如果我没理解错的话,你问的是 setter 的调用者。这意味着,在到达 setter 本身之前调用堆栈中的前一个方法调用(这也是一种方法)。

为此使用StackTrace.GetFrames 方法。例如(取自 http://www.csharp-examples.net/reflection-callstack/ ):

using System.Diagnostics;

[STAThread]
public static void Main()
{
StackTrace stackTrace = new StackTrace(); // get call stack
StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames)

// write call stack method names
foreach (StackFrame stackFrame in stackFrames)
{
Console.WriteLine(stackFrame.GetMethod().Name); // write method name
}
}

输出:

Main
nExecuteAssembly
ExecuteAssembly
RunUsersAssembly
ThreadStart_Context
Run
ThreadStart

基本上,您要的是 stackFrames[1].GetMethod().Name

关于c# - 在 setter 中确定调用者——或静默设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19737351/

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