-1

我有一个名为MyProperty. 我有兴趣获取对调用属性设置器的对象的引用。例如:

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

4 回答 4

0

你可以利用反射。虽然这种方法不是我推荐的。

StackTrace stackTrace = new StackTrace();
var modifier = stackTrace.GetFrame(1).GetType();

if (modifier == typeof(UIControl))
{
  //some code
}

我没有对此进行测试,但应该是正确的。

您还可以查看CallerMemberNameAttribute,它可能与您有关。

于 2013-06-23T22:05:19.560 回答
0

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

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

但是,这种类型的代码应该设置警报。使用反射来展开堆栈是脆弱的、不直观的,并且违背了关注点分离。属性的设置器是一种抽象,旨在设置除了要设置的值之外的值。

有几个更强大的选择。其中,考虑有一个仅由 调用的方法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
}
于 2013-06-23T22:08:47.243 回答
0

实际上 .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

于 2013-06-23T22:15:07.433 回答
0

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

于 2013-06-23T21:51:22.893 回答