2012-03-23 55 views
2

比方说,我有一个属性类:属性类如何引用使用它的实例?

public class MyCustomAttribute : Attribute 
{ 
    // do stuff 
} 

而且我用类属性这个属性:

public class MyModel : BaseModel 
{ 
    [MyCustom] 
    public string Name { get; set; } 
} 

有没有一种方式,MyCustomAttribute代码中,引用的MyModel实例它正在被使用?

最终,我只是试验AOP(使用PostSharp)来创建属性来跟踪模型是否脏。所以,如果BaseModelIsDirty财产话,我希望能够做这样的事情与PostSharp:

public class TrackDirtyPropertyAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnSuccess(MethodExecutionArgs args) 
    { 
     someReferenceToTheObject.IsDirty = true; 
    } 
} 

我试图传递引用到属性的构造函数:

public class TrackDirtyPropertyAttribute : OnMethodBoundaryAspect 
{ 
    private BaseModel _currentObject { get; set; } 

    public TrackDirtyPropertyAttribute(BaseModel currentObject) 
    { 
     _currentObject = currentObject; 
    } 

    public override void OnSuccess(MethodExecutionArgs args) 
    { 
     _currentObject.IsDirty = true; 
    } 
} 

然而,当我使用它:

[TrackDirtyProperty(this)] 
public string Name { get; set; } 

它告诉我,this是不是在这方面提供。

+0

在在其编织正在发生的事情的时候,就会出现0 *实例*之类的 - 你的属性与类相关联,*不*有类的一个实例。 – 2012-03-23 15:01:55

+1

如果使用PostSharp,那么你会想要做@Gael Fraiteur建议的。 – ILovePaperTowels 2012-03-23 15:42:35

回答

4

你应该做的是这样的:

public class TrackDirtyPropertyAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnSuccess(MethodExecutionArgs args) 
    { 
     ((BaseModel) args.Instance).IsDirty = true; 
    } 
} 
2

您的构造函数不能工作(至少不会与this),因为属性构造函数参数必须在静态上下文中可访问。并且默认情况下,你不能简单地访问利用类型的实例 - 这是有道理的,因为这基本上是元数据(应用于定义,而不是实例 - 刚刚出现的实例“束缚”它)。因此,您可以本地访问类型的属性,但不能访问属性使用的类型的实例。你可能可以通过一些人为的反思等等来获得它(我甚至不会冒险想到这个),但是,不像其他人那么优雅。

在另一个说明中,将元素的状态存储在属性中对我来说没有意义 - 这不够持久。进行计算来检索一个值(例如,你确实掌握了实例,并设法运行一些逻辑来确定它是否“脏”,并在这个意义上提供了“实时”值)是的,但是使用它来坚持应用于它的信息在声明事实之后似乎是徒劳的,因为该属性的哪个实例仍然存在?无论如何,也不管我在说这些时完全错过了什么,这就是这些实例本身的作用。