C#属性,只能在具有其他属性的类中的方法上

时间:2016-02-26 02:12:31

标签: c# attributes restriction

在C#中是否可以对属性设置限制,使其只能在具有其他属性的类中的方法上?

[MyClassAttribute]
class Foo
{
    [MyMethodAttribute]
    public string Bar()
}

“MyMethodAttribute”只能位于具有“MyClassAttribute”的类中。

这可能吗?如果是这样,怎么办呢?

3 个答案:

答案 0 :(得分:1)

如果您要尝试运行时验证方法属性,可以执行以下操作:

public abstract class ValidatableMethodAttribute : Attribute
{
    public abstract bool IsValid();
}

public class MyMethodAtt : ValidatableMethodAttribute
{
    private readonly Type _type;

    public override bool IsValid()
    {
        // Validate your class attribute type here
        return _type == typeof (MyMethodAtt);
    }

    public MyMethodAtt(Type type)
    {
        _type = type;
    }
}

[MyClassAtt]
public class Mine
{
    // This is the downside in my opinion,
    // must give compile-time type of containing class here.
    [MyMethodAtt(typeof(MyClassAtt))]
    public void MethodOne()
    {

    }
}

然后使用反射查找系统中的所有ValidatableMethodAttributes,并在其上调用IsValid()。这不是非常可靠且相当脆弱,但这种类型的验证可以实现您的目标。

或者传递类的类型(Mine),然后在IsValid()中使用反射来查找Mine类型的所有属性。

答案 1 :(得分:1)

您可以使用PostSharp执行此操作:(see: Compile time Validation in this tutorial)

然后在您的属性中,将使用与此类似的代码检查父类:

$file = $request->file('userfile');

Excel::load($file, function($reader)
{
foreach ($reader->toArray() as $row) 
{
dd($row);
// fire your query here to insert data to db...
}
}

答案 2 :(得分:0)

您无法在用户定义的属性上执行此操作。但我相信编译器有这样的机制,内置的FieldOffsetAttribute使用它。

struct MyStruct
{
    [FieldOffset(1)]    //compile error, StructLayoutAttribute is required
    private int _num;
}

编辑如果您使用PostSharp之类的内容注入构建过程,我认为这是可行的。