获取set属性的修饰符

本文关键字:set 属性 获取 | 更新日期: 2023-09-27 18:19:40

我有一个名为MyProperty的属性。我感兴趣的是获得对调用该属性的setter的对象的引用。例如:

MyProperty
{
  set
  {
    if (modifer.GetType() == typeof(UIControl))
    {
      //some code
    }
    else
    {
      //some code
    }
  }
}

获取set属性的修饰符

我认为这是不可能的,除非你打开堆栈?你可以这样做,但我不推荐。

可以在运行时检查当前堆栈。这将使您能够检查调用方法的类:

StackTrace stackTrace = new StackTrace();
var callingMethod = stackTrace.GetFrame(1).GetMethod();
var callingType = callingMethod.ReflectedType 
//Or possible callingMethod.DeclaringType, depending on need

然而,这种类型的代码应该设置警报。使用反射来展开堆栈是脆弱的、非直观的,并且难以分离关注点。属性的setter是一个抽象,旨在设置除了要设置的值之外没有其他内容的值。

有几个更强有力的替代方案。其中,考虑使用仅由UIControls:调用的方法

public void SetMyPropertyFromUiControl(MyType value)
{
    this.MyProperty = value;
    ... other logic concerning UIControl
}

如果用于设置属性的UIControl实例的详细信息很重要,那么方法签名可能看起来像:

public void SetMyPropertyFromUiControl(MyType value, UIControl control)
{
    this.MyProperty = value;
    ... other logic concerning UIControl that uses the control parameter
}

您可以利用反射。尽管我不推荐这种方法。

StackTrace stackTrace = new StackTrace();
var modifier = stackTrace.GetFrame(1).GetType();
if (modifier == typeof(UIControl))
{
  //some code
}

我没有测试这个,但应该是正确的。

您也可以查看CallerMemberNameAttribute,它可能与您相关。

实际上,.NET 4.5中有一个新功能,叫做"调用者信息"。

你可以得到一些关于来电者的信息,比如:

public Employee([CallerMemberName]string sourceMemberName = "", 
                [CallerFilePath]string sourceFilePath = "", 
                [CallerLineNumber]int sourceLineNo = 0)
{
    Debug.WriteLine("Member Name : " + sourceMemberName);
    Debug.WriteLine("File Name : " + sourceFilePath);
    Debug.WriteLine("Line No. : " + sourceLineNo);
}


更多信息:呼叫者信息-codeguru.com