在C#中是否可以对属性设置限制,使其只能在具有其他属性的类中的方法上?
[MyClassAttribute]
class Foo
{
[MyMethodAttribute]
public string Bar()
}
“MyMethodAttribute”只能位于具有“MyClassAttribute”的类中。
这可能吗?如果是这样,怎么办呢?
答案 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之类的内容注入构建过程,我认为这是可行的。