获取方法调用者,甚至通过使用编译器服务来更改属性名称非常简单,如下所示:
public class EmployeeVM:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName=null)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
// The compiler converts the above line to:
// RaisePropertyChanged ("Name");
}
}
private string _phone;
public string Phone
{
get { return _phone; }
set
{
_phone = value;
OnPropertyChanged();
// The compiler converts the above line to:
// RaisePropertyChanged ("Phone");
}
}
}
但是有可能从集合本身内部获取“set”函数的调用者吗?我不知道你是如何在该范围内进行语法定义的。 AKA,谁打电话给Phone =?
答案 0 :(得分:2)
查看StackFrame,特别是GetMethod,它为您提供方法名称(您需要选择以前的堆栈帧之一,具体取决于编写辅助函数是否这样做)。文章中的样本:
StackTrace st = new StackTrace();
StackTrace st1 = new StackTrace(new StackFrame(true));
Console.WriteLine(" Stack trace for Main: {0}",
st1.ToString());
Console.WriteLine(st.ToString());
通过搜索像How do I find the type of the object instance of the caller of the current function?
这样的StackFrame,可以找到其他类似的问题答案 1 :(得分:1)
不幸的是[CallerMemberName]
AttributeUsage设置为AttributeTargets.Parameter
,因此它只能用于参数,例如方法签名
但您可以使用StackFrame
提及的Alexei Levenkov
public string Phone
{
get { return _phone; }
set
{
string setterCallerName = new StackFrame(1).GetMethod().Name;
_phone = value;
OnPropertyChanged();
}
}