首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装饰性能

装饰性能
EN

Stack Overflow用户
提问于 2014-06-26 12:14:24
回答 1查看 201关注 0票数 0

我想“装饰”我自己的物品的属性。例如,我想知道一个getter被调用了多少次,设置器需要多长时间,记录任何新值.

我正试图尽可能简单地做到这一点。理想的解决方案可能使用属性,它可以如下所示:

代码语言:javascript
复制
public class MyClass
{
    [CountGetterCalls]
    [LogSettingValue]
    public int SomeProperty;
}

我没有成功地实现这个,作为一个解决方案,我尝试了一种属性包装。但这还远远不够完美。你会怎么做?

代码语言:javascript
复制
public class MyClass
{
    public MyClass()
    {
        SomeProperty = new PropertyWrapper<int>(new CountCallsPropertyDecorator<int>(new LogSettingPropertyDecorator<int>(new NullDecorator<int>())));
    }

    public PropertyWrapper<int> SomeProperty;
}

public interface IPropertyDecorator<T>
{
    void OnGetValue();
    void OnSetValue(T value);
}

public class PropertyWrapper<T>
{
    private readonly IPropertyDecorator<T> _decorator;
    private T _value;

    public PropertyWrapper(IPropertyDecorator<T> decorator)
    {
        _decorator = decorator;
    }

    public T Value
    {
        get
        {
            _decorator.OnGetValue();
            return _value;
        }
        set
        {
            _decorator.OnSetValue(value);
            _value = value;
        }
    }
}

public class CountCallsPropertyDecorator<T> : IPropertyDecorator<T>
{
    private readonly IPropertyDecorator<T> _decorator;
    private int _nbGetCalled;
    private int _nbSetCalled;

    public int NbGetCalled { get { return _nbGetCalled; } }
    public int NbSetCalled { get { return _nbSetCalled; } }

    public CountCallsPropertyDecorator(IPropertyDecorator<T> decorator)
    {
        _decorator = decorator;
    }

    public void OnGetValue()
    {
        _decorator.OnGetValue();
        _nbGetCalled++;
    }

    public void OnSetValue(T value)
    {
        _decorator.OnSetValue(value);
        _nbSetCalled++;
    }
}

public class LogSettingPropertyDecorator<T> : IPropertyDecorator<T>
{
    private readonly IPropertyDecorator<T> _decorator;

    public LogSettingPropertyDecorator(IPropertyDecorator<T> decorator)
    {
        _decorator = decorator;
    }

    public void OnGetValue() { _decorator.OnGetValue(); }
    public void OnSetValue(T value)
    {
        _decorator.OnSetValue(value);
        Console.WriteLine("Property called.");
    }
}

public class NullDecorator<T> : IPropertyDecorator<T>
{
    public void OnGetValue() { }

    public void OnSetValue(T value) { }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-26 12:24:24

在.net中,方法“修饰”不像其他语言(例如Python)那样工作,属性的存在不会改变方法的行为,只改变它的元数据。元数据可用于通过其他工具更改其行为。

您需要和AOP框架(如专有的PostSharp)或动态代理生成器(如LinFu卡塞尔)来实现您想要的目标。

两者各有优缺点,各看一看。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24430261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档