【问题标题】:get modifier of set property [duplicate]获取设置属性的修饰符[重复]
【发布时间】:2013-06-20 09:07:28
【问题描述】:

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

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

【问题讨论】:

  • 什么是modifier,您认为您的代码有什么问题?
  • 这是您停止使用属性并改用方法的地方。有论据。

标签: c# properties


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    但是,这种类型的代码应该设置警报。使用反射来展开堆栈是脆弱的、不直观的,并且违反了separation of concerns。属性的 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
    }
    

    【讨论】:

    • 如果对属性的调用是内联的,reflecion 方法将不起作用。在这种情况下,您可以获取调用者方法的调用者并返回。但它会在调试器中完美运行,因为 JIT 优化通常在调试时被关闭。
    • @AloisKraus 好点!这种方法薄弱的另一个原因。
    【解决方案4】:

    其实 .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);
    }
    


    更多信息: Caller Info - codeguru.com

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 2012-11-22
      • 2017-04-13
      • 2012-05-04
      • 2013-03-09
      相关资源
      最近更新 更多