C#中可以通过attribute实现类、方法等的特殊属性。
如[ SerializableAttribute],但不知是如何工作的。在mvc中有[httppost] attribute当get方法时,将会禁止,提示找不到页面。
如此尝试,自定义一个attribute,然后使用。
控制台,并没有中断
public class abc : Attribute
{
public abc()
{
say();
}
void say() { throw new Exception() { }; }
}
class Program
{
static void Main()
{
var e = new b();
e.bb();
Console.Read();
}
}
class b
{
[abc()]
public void bb() {
Console.Write(12);
}
}
问题:我期望 方法bb在加入 abc attribute后,调用时能执行say函数,而say函数中有throw,然而实际并没有发生throw。
attribute都是通过反射调用的。加入你在User类上标记了[Serializable],然后将它序列化成xml,代码大概就是:
User user = ...;
var serializer = new XmlSerializer(typeof(User));
serializer.Serialize(user);
在最后一句Serialize(user)调用中,框架类库的代码用反射获取到了User类的元数据,其中就包括SerializableAttribute,如果你没加,就会被发现并且抛出异常。
MVC是同样的道理。你写了一个controller,里面包含若干个action,当一个请求过来时,MVC框架代码会根据请求寻找到对应的action方法。如果某个action标记了[HttpPost],那么MVC框架代码在通过反射寻找“合适的action”时,就会检查它,如果最终没有找到合适的action,就会报404. 因此attribute一般都是在反射时获取到并执行逻辑的,你认为的哪些“自动”的行为,其实是框架代码帮你完成了。
谢谢。
你的问题是什么?
attribute你得配合反射使用啊