我現在有一個自定義屬性,我不知道如何限制對我應用了我的屬性的方法的訪問。處理自定義屬性
例如:如果CustomRole的值是"Admin"
,那麼只有它應該訪問方法,我現在有自定義屬性,如"CustomRole"
。
CustomRole["Admin"]
public void Method()
{
// code
}
如何執行驗證的價值?
我現在有一個自定義屬性,我不知道如何限制對我應用了我的屬性的方法的訪問。處理自定義屬性
例如:如果CustomRole的值是"Admin"
,那麼只有它應該訪問方法,我現在有自定義屬性,如"CustomRole"
。
CustomRole["Admin"]
public void Method()
{
// code
}
如何執行驗證的價值?
您需要某種aspect oriented programming的方法。由於屬性本身不能被運行時評估,因此屬性本身無法「訪問」,但是您可能會使用一些攔截該調用的框架,檢查屬性和上下文並正確處理該案例。
因此,在短期,你會:
[RequiredPermission(Permissions.CanCreateOrder)]
public virtual Guid CreateOrder(string orderCode) {...}
截獲通話:呼叫將根據您的實現
指定要求
正如你已經指出的,這可以很容易地與屬性指定的被截獲並處理
現在你需要選擇一個工具來實例化你的對象並截獲對它的調用。這可以使用支持AOP的IoC容器完成,也可以手動包裝(例如,使用AOP工具爲對象創建代理並使用代理)。
您需要編寫一個攔截器或者一個包裝方法,它有機會在將執行轉發給您的方法或拒絕調用之前評估呼叫上下文。
您可以find a discussion and code samples here。看看通過屬性聲明需求的OrderManagementService
類。
窮人的AOP
你可以做到這一切,而不訴諸適當的AOP工具,但在一個不太通用的方法(這可能是比較簡單的項目完全正常),使用某種形式的Decorator模式 - 請注意,這是從頭寫的,不是在IDE中:
interface IService
{
void Method();
}
class ServiceImpl : IService // one of many implementations
{
[CustomRole("Admin")]
public void Method() { ... }
}
class ServiceChecker : IService // one of many implementations
{
IService m_svc;
public ServiceChecker(IService wrapped) { m_svc = wrapped; }
public void Method()
{
var mi = m_svc.GetType().GetMethod("Method");
if(mi.IsDefined(typeof(CustomRoleAttribute), true)
{
CustomRoleAttribute attr = (CustomRoleAttribute)mi.GetCustomAttributes(typeof(CustomRoleAttribute), true)[0];
if(!attr.Role.Equals(GetCurrentUserRole()) // depends on where you get user data from
{
throw new SecurityException("Access denied");
}
}
m_svc.Method();
}
}
// the client code
IService svc = new ServiceChecker(new ServiceImpl());
svc.Method();
您的代碼看起來有點不對。 這裏是我的類有CustomRoleAttribute
public class MyClass
{
[CustomRole("Admin")]
public void MyMethod()
{
}
}
您屬性應該定義AttributeUsage
,以確保其他開發方法不使用您的屬性上的屬性或構造函數:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false,Inherited = true)]
public class CustomRoleAttribute : Attribute
{
public string Role { get; private set; }
public CustomRoleAttribute(string role)
{
Role = role;
}
}
現在把兩者一起:
MyClass myClass = new MyClass();
MethodInfo[] methods = myClass.GetType().GetMethods(); // Access all the public methods.
foreach (var methodInfo in methods) // iterate trough all methods.
{
// Get all custom attributes from the method.
object[] attributes = methodInfo.GetCustomAttributes(typeof (CustomRoleAttribute), true);
if (attributes.Length > 0)
{
CustomRoleAttribute attribute = (CustomRoleAttribute)attributes[0];
if (attribute.Role == "Admin")
{
// the role is admin
}
}
}
您現在看到如何使用屬性。你必須首先檢查屬性並訪問該方法。