好的,我有一个类似的情况,它是我的业务逻辑中的访问控制方法。
有一个保存函数可以应用于我的任何持久层对象。
所以看起来像这样
public static Save<T>(AccessControl.User user,T entity) where T:PersistanceLayerBaseClass
{
if(CanWrite(user, entity))
{
entity.save();
}
else
{
throw new Exception("Cannot Save");
}
}
然而,对于某些实体的访问控制,我有一些自定义代码,因此我编写了以下代码,它使用System.Reflection查找更适合问题的方法,“此用户是否可以编写此实体?”
public static Boolean CanWrite<T>(AccessControl.User user, T entity) where T : PersistanceLayerBaseClass
{
int? clubId = null;
MethodInfo methodInfo = entity.GetType().GetMethod("CanWrite", new Type[] { typeof(AccessControl.User), entity.GetType() });
if(methodInfo != null)
{
return (Boolean)methodInfo.Invoke(null, new object[] { user, entity }) ;
}
else
{
}
return HasRole(user.UserID, "Administrator") || (clubId.HasValue && user.MemberObject.ClubId == clubId.Value && HasRole(user.UserID, "AdministerClub"));
}
现在每次我添加或删除一个方法,我只需要在一个地方添加或删除它。
OuterMethod
不是通用的,它的参数类型是object
而不是T
类型。 - ChrisW