自定义属性C#不工作
问题描述:
我有AuthActivityAttribute类。这个类的目的是授权用户有权执行特定的活动。自定义属性C#不工作
属性类:
[AttributeUsage(AttributeTargets.All)]
public class AuthActivityAttribute : Attribute
{
#region Properties
public string ActivityName { get; set; }
#endregion
#region Constructor
public AuthActivityAttribute()
{
}
#endregion
#region MemberFunctions
private List<aspnetactivities> GetUserActivities(ApplicationUser currentUser)
{
IList<string> roles = DALAccessObjectObj.UserDALObj.GetUserRoles(currentUser);
List<aspnetactivities> lstAspnetActivites = new List<aspnetactivities>();
foreach (string role in roles)
{
List<aspnetactivities> activities = DALAccessObjectObj.UserDALObj.GetRoleActivity(role);
lstAspnetActivites.AddRange(activities);
}
return lstAspnetActivites;
}
public void ValidateUserActivity()
{
DALAccessObjectObj.UserDALObj = new UserDAL();
ApplicationUser currentUser = DALAccessObjectObj.UserDALObj.GetUserById(HttpContext.Current.User.Identity.GetUserId());
if (GetUserActivities(currentUser).Where(r => r.ActivityName.Equals(ActivityName, StringComparison.InvariantCultureIgnoreCase)
).Select(r => r).Count() > 0)
{
throw new Exception(string.Format("User is not allowed to perform activity named : {0}", ActivityName));
}
}
#endregion
}
我有一个帐户控制器类。我所需要的只是如果允许他进行注册活动,用户只能注册。但是,当我发送请求的属性不验证任何事情。请让我知道我错过了什么或什么?
类装饰有属性
public class AccountController : BaseApiController
{
[AuthActivityAttribute(ActivityName = "Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
// do something ...
}
}
例如:我们把验证像属性[的MaxLength(10)],以便它验证该属性的长度必须小于10或授权在C#属性。就像只有管理员可以访问特定的方法。所以这是我需要实现的东西
[Authorize("Administrator")]
public void DeleteUser()
{
// do something
}
我想要什么?
[AuthActivity("DeleteUser")]
public void DeleteUser()
{
// do something
}
答
如果你的目标是让与否用户执行一个任务,你并不需要创建一个自定义属性,您可以使用授权属性,每一个动作,并指定允许的角色执行该操作。
任何方式,如果你想使用自定义属性来执行一些自定义任务,必须使用反射来获取具有该属性的行动,并获得该属性的属性,是这样的:
public static class CustomAttrr
{
public static IEnumerable<ActionsWithAuthActivityAttribute> GetItems(Assembly types)
{
var model = from type in types.GetTypes()
from methodInfo in type.GetMethods().Where(x => x.GetCustomAttributes<AuthActivityAttribute>().Any())
from attribute in methodInfo.GetCustomAttributes()
where attribute is AuthActivityAttribute
let a = attribute as AuthActivityAttribute
select new ActionsWithAuthActivityAttribute
{
ActionName = methodInfo.Name,
ActivityName = a.ActivityName,
};
return model.ToList();
}
}
public class AuthActivityAttribute:Attribute
{
public string ActivityName { get; set; }
}
public class ActionsWithAuthActivityAttribute
{
public string ActionName { get; set; }
public string ActivityName { get; set; }
}
现在,您已经列出了用您的属性装饰的所有操作,并且您可以做任何您想要的操作。
var listAction = CustomAttrr.GetItems(Assembly.GetExecutingAssembly());
var listActionsRegister = listAction.Where(x => x.ActivityName.Equals("Register"));
现在您可以检查用户角色与此列表,但正如我所说的,您不需要此自定义属性。
我只发布了此代码,供您了解如何访问自定义属性。
那么你期望使用该属性来执行验证?什么是'PlanhayAttributeBase'? –
亲爱的@JonSkeet请再次检查我编辑它。 –
那么,你已经改变了基类。您仍然没有解释为什么您期望该属性自动执行某些操作。属性不会神奇地让代码执行 - 某些事物必须*找到*所有相关的属性并相应地采取行动。你希望在你的情况下做什么? –