Vấn đề với mã của bạn là chữ ký của public bool MethodHasAuthorizeAttribute(Func<int, ActionResult> function)
. MethodHasAuthorizeAttribute
chỉ có thể được sử dụng với các đối số khớp với chữ ký của đại biểu bạn đã chỉ định. Trong trường hợp này, phương thức trả lại số ActionResult
với thông số loại int
.
Khi bạn gọi phương thức này như MethodHasAuthorizeAttribute(controller.Method3)
, Trình biên dịch sẽ thực hiện chuyển đổi nhóm phương pháp. Điều này có thể không phải lúc nào cũng mong muốn và có thể mang lại kết quả không mong muốn (Chuyển đổi nhóm phương pháp không phải lúc nào cũng thẳng thắn). Nếu bạn cố gắng gọi MethodHasAuthorizeAttribute(controller.Method1)
bạn sẽ nhận được một lỗi trình biên dịch vì không có chuyển đổi.
Một giải pháp tổng quát hơn có thể được xây dựng bằng cây biểu thức và mẹo "MethodOf" nổi tiếng. Nó sử dụng trình biên dịch tạo ra cây biểu thức để tìm ra mục tiêu gọi:
public static MethodInfo MethodOf(Expression<System.Action> expression)
{
MethodCallExpression body = (MethodCallExpression)expression.Body;
return body.Method;
}
Bạn có thể sử dụng nó như thế này, nhưng nó cũng có thể được sử dụng với phương pháp nào:
MethodInfo method = MethodOf(() => controller.Method3(default(int)));
Với điều đó ra khỏi con đường, chúng tôi có thể xây dựng triển khai chung:
public static bool MethodHasAuthorizeAttribute(Expression<System.Action> expression)
{
var method = MethodOf(expression);
const bool includeInherited = false;
return method.GetCustomAttributes(typeof(AuthorizeAttribute), includeInherited).Any();
}
Được rồi, đó là phương pháp. Bây giờ, nếu bạn muốn áp dụng các thuộc tính kiểm tra trên các lớp hoặc các lĩnh vực để (tôi sẽ phụ thuộc tài sản vì chúng thực sự là phương pháp), chúng ta cần thực hiện kiểm tra của chúng tôi trên MemberInfo
, là gốc thừa kế cho Type
, FieldInfo
và MethodInfo
. Đây dễ dàng như chiết xuất tìm kiếm thuộc tính thành một phương pháp riêng biệt và cung cấp phương pháp chuyển đổi thích hợp với những cái tên đẹp:
public static bool MethodHasAuthorizeAttribute(Expression<System.Action> expression)
{
MemberInfo member = MethodOf(expression);
return MemberHasAuthorizeAttribute(member);
}
public static bool TypeHasAuthorizeAttribute(Type t)
{
return MemberHasAuthorizeAttribute(t);
}
private static bool MemberHasAuthorizeAttribute(MemberInfo member)
{
const bool includeInherited = false;
return member.GetCustomAttributes(typeof(AuthorizeAttribute), includeInherited).Any();
}
Tôi sẽ để lại việc thực hiện cho các lĩnh vực như một bài tập, bạn có thể sử dụng các thủ thuật tương tự như MethodOf.
Bạn có muốn kiểm tra xem lớp, phương pháp hoặc thuộc tính có Thuộc tính như vậy trong một phương pháp chung không? –
Có phải bạn chỉ muốn biết liệu một phương pháp có một loại thuộc tính nào đó được áp dụng trên nó không? – Rajesh
Tôi muốn kiểm tra xem phương pháp có một tập hợp thuộc tính cụ thể nhưng tôi không muốn chuyển một tên phương thức như một chuỗi. – 4rchie