从C#中的参数属性访问对象值

Aph*_*pha 5 c# custom-data-attribute

这是我的方法

public Component SaveComponent([ValidateMetaFields] Component componentToSave) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是我的自定义属性:

[AttributeUsage(AttributeTargets.Parameter)]
public class ValidateMetaFieldsAttribute : Attribute
{
    public ValidateMetaFieldsAttribute()
    {
        // how to access `componentToSave` here?
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道有没有办法从中访问componentToSave对象ValidateMetaFieldsAttribute?我找不到任何示例代码或示例.

Jon*_*eet 17

不,属性实例没有任何关于它们应用于的目标的概念.

请注意,通常您目标中获取属性,因此无论何时进行该获取都可能将信息提供给接下来的任何内容.可能有点讨厌,但希望不是不可行的.

所有这一切的一个小例外是调用者信息属性 - 如果你使用类似的东西

[AttributeUsage(AttributeTargets.Parameter)]
public class ValidateMetaFieldsAttribute : Attribute
{
    public ValidateMetaFieldsAttribute([CallerMemberName] string member = null)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

...然后编译器将在这种情况下填写方法名称(SaveComponent),即使该属性应用于参数.同样,您可以获取文件路径和行号.

鉴于此目的的评论,我认为你有一个更大的问题:

验证componentToSave并在方法体甚至运行之前抛出异常.

只有在获取属性时,才会执行属性构造函数中的代码.例如,它不会在每个方法调用上执行.这可能会使你期望的任何东西变得不可行.

您可能希望查看AOP,例如使用PostSharp.