Debugging 有没有通过反射观察属性设置器的现有方法?

Debugging 有没有通过反射观察属性设置器的现有方法?,debugging,xamarin.ios,portable-class-library,code-injection,system.reflection,Debugging,Xamarin.ios,Portable Class Library,Code Injection,System.reflection,监视属性的设定者是否可以通过反射实现 比如说,我在某处有一个方法接收以下内容: private void LogPropertySetter(string propertyName, string newPropertyValue) { Logger.Log("Property " + propertyName + " has been set to " + newPropertyValue); } private int _x; public int X { get { re

监视属性的设定者是否可以通过反射实现

比如说,我在某处有一个方法接收以下内容:

private void LogPropertySetter(string propertyName, string newPropertyValue)
{
    Logger.Log("Property " + propertyName + " has been set to " + newPropertyValue);
}
private int _x;
public int X
{
    get { return _x; }
    set
    {
        _x = value;
        string propName = MethodInfo.GetCurrentMethod().Name.Substring(4);
        LogPropertySetter(propName, value);
    }
}
我在应用程序的某个地方有一个属性,我想观察:

public int FlyingCatsAmount { get; set; }
注意,我没有故意在这里放置一组私有/公共变量,以便解决方案应用于属性

我是否可以通过反射或任何其他API(在调试中)在setter中添加这样的调用,允许从代码而不是在AOP(PostSharp)中修改setter


不,像这样的事情是无法用反思来完成的。反射不是调试器。调试器API可以。

不,反射无法完成类似的操作。反射不是调试器。调试器API可以。

不,反射无法完成类似的操作。反射不是调试器。调试器API可以。

不,反射无法完成类似的操作。反射不是调试器。调试器API可以。

如果您使用的是.net 4.5,则可以调用一个方法并获取callerpropertyname

例如:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{}
从.net 3.5到4,您可以使用以下方法:

   protected virtual void RaisePropertyChanged<T>(Expression<Func<T>> expProperty)
    {
        this.RaisePropertyChanged(((MemberExpression)expProperty.Body).Member.Name);
    }

如果您使用的是.net 4.5,则可以调用一个方法并获取callerpropertyname

例如:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{}
从.net 3.5到4,您可以使用以下方法:

   protected virtual void RaisePropertyChanged<T>(Expression<Func<T>> expProperty)
    {
        this.RaisePropertyChanged(((MemberExpression)expProperty.Body).Member.Name);
    }

如果您使用的是.net 4.5,则可以调用一个方法并获取callerpropertyname

例如:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{}
从.net 3.5到4,您可以使用以下方法:

   protected virtual void RaisePropertyChanged<T>(Expression<Func<T>> expProperty)
    {
        this.RaisePropertyChanged(((MemberExpression)expProperty.Body).Member.Name);
    }

如果您使用的是.net 4.5,则可以调用一个方法并获取callerpropertyname

例如:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{}
从.net 3.5到4,您可以使用以下方法:

   protected virtual void RaisePropertyChanged<T>(Expression<Func<T>> expProperty)
    {
        this.RaisePropertyChanged(((MemberExpression)expProperty.Body).Member.Name);
    }

在.NET 4.5之前,可以使用以下内容获取当前属性名称:

private void LogPropertySetter(string propertyName, string newPropertyValue)
{
    Logger.Log("Property " + propertyName + " has been set to " + newPropertyValue);
}
private int _x;
public int X
{
    get { return _x; }
    set
    {
        _x = value;
        string propName = MethodInfo.GetCurrentMethod().Name.Substring(4);
        LogPropertySetter(propName, value);
    }
}
本例中的CurrentMethod名称将是
set\u X
,因此去掉前4个字符返回
X

但是,有一个很大的警告,即该方法可能会被编译器优化掉,因此无法按您希望的方式工作。您可以设置以下属性以停止其内联,但这可能会导致性能损失,通常不建议这样做:

public int X
{
    get { return _x; }
    [System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.NoInlining)]
    set
    {
        _x = value;
        LogPropertySetter(MethodInfo.GetCurrentMethod().Name.Substring(4), value);
    }
}

如果您使用的是.NET 4.5,我建议您采纳Cadburry的建议。

在.NET 4.5之前,可以使用以下内容获取当前属性名称:

private void LogPropertySetter(string propertyName, string newPropertyValue)
{
    Logger.Log("Property " + propertyName + " has been set to " + newPropertyValue);
}
private int _x;
public int X
{
    get { return _x; }
    set
    {
        _x = value;
        string propName = MethodInfo.GetCurrentMethod().Name.Substring(4);
        LogPropertySetter(propName, value);
    }
}
本例中的CurrentMethod名称将是
set\u X
,因此去掉前4个字符返回
X

但是,有一个很大的警告,即该方法可能会被编译器优化掉,因此无法按您希望的方式工作。您可以设置以下属性以停止其内联,但这可能会导致性能损失,通常不建议这样做:

public int X
{
    get { return _x; }
    [System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.NoInlining)]
    set
    {
        _x = value;
        LogPropertySetter(MethodInfo.GetCurrentMethod().Name.Substring(4), value);
    }
}

如果您使用的是.NET 4.5,我建议您采纳Cadburry的建议。

在.NET 4.5之前,可以使用以下内容获取当前属性名称:

private void LogPropertySetter(string propertyName, string newPropertyValue)
{
    Logger.Log("Property " + propertyName + " has been set to " + newPropertyValue);
}
private int _x;
public int X
{
    get { return _x; }
    set
    {
        _x = value;
        string propName = MethodInfo.GetCurrentMethod().Name.Substring(4);
        LogPropertySetter(propName, value);
    }
}
本例中的CurrentMethod名称将是
set\u X
,因此去掉前4个字符返回
X

但是,有一个很大的警告,即该方法可能会被编译器优化掉,因此无法按您希望的方式工作。您可以设置以下属性以停止其内联,但这可能会导致性能损失,通常不建议这样做:

public int X
{
    get { return _x; }
    [System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.NoInlining)]
    set
    {
        _x = value;
        LogPropertySetter(MethodInfo.GetCurrentMethod().Name.Substring(4), value);
    }
}

如果您使用的是.NET 4.5,我建议您采纳Cadburry的建议。

在.NET 4.5之前,可以使用以下内容获取当前属性名称:

private void LogPropertySetter(string propertyName, string newPropertyValue)
{
    Logger.Log("Property " + propertyName + " has been set to " + newPropertyValue);
}
private int _x;
public int X
{
    get { return _x; }
    set
    {
        _x = value;
        string propName = MethodInfo.GetCurrentMethod().Name.Substring(4);
        LogPropertySetter(propName, value);
    }
}
本例中的CurrentMethod名称将是
set\u X
,因此去掉前4个字符返回
X

但是,有一个很大的警告,即该方法可能会被编译器优化掉,因此无法按您希望的方式工作。您可以设置以下属性以停止其内联,但这可能会导致性能损失,通常不建议这样做:

public int X
{
    get { return _x; }
    [System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.NoInlining)]
    set
    {
        _x = value;
        LogPropertySetter(MethodInfo.GetCurrentMethod().Name.Substring(4), value);
    }
}


如果您使用的是.NET 4.5,我建议您采纳Cadburry的建议。

这很有趣。如果你说调试器API可以,你的意思是它可以实现类似的结果?比如在为特定属性调用setter时调用方法或事件处理程序?这是否存在于PCL中?@LéonPelletier-请注意,这些简单的方法可能会在JIT代码中内联。您可能需要在数据更改时设置硬件断点(当您希望跟踪内存中特定位置的更改时,VS就是这么做的)。如果您编写自己的代码,肯定有更可行的方法。调试器实际上可以替换方法的字节码;)TomTom对你最后的评论很感兴趣,因为我想做的只是在调试上下文中运行。那么你就不走运了-一个.NET运行时只能附加一个调试器,所以你的代码就不能附加。这很有趣。如果你说调试器API可以,你的意思是它可以实现类似的结果?比如在为特定属性调用setter时调用方法或事件处理程序?这是否存在于PCL中?@LéonPelletier-请注意,这些简单的方法可能会在JIT代码中内联。您可能需要在数据更改时设置硬件断点(当您希望跟踪内存中特定位置的更改时,VS就是这么做的)。如果您编写自己的代码,肯定有更可行的方法。调试器实际上可以替换方法的字节码;)TomTom对你最后的评论很感兴趣,因为我想做的只是在调试上下文中运行。那么你就不走运了-一个.NET运行时只能附加一个调试器,所以你的代码就不能附加。这很有趣。如果你说调试器API可以,你的意思是它可以实现类似的结果?比如在为特定属性调用setter时调用方法或事件处理程序?这是否存在于PCL中?@LéonPelletier-请注意,这些简单的方法可能会在JIT代码中内联。你很可能会忘记