我正在维护一个现有的C#应用程序,该应用程序将三个对象实现为除名称之外完全相同的类。
public class Role1
{
public string lala {get;set;}
public string abab {get;set;}
public string cxcx {get;set;}
public Role1(string lala, string abab, string cxcx)
{
}
public List<Role1> GetMembers()
{
return dataaccesslayer.GetRole1Members();
}
}
public class Role2
{
public string lala {get;set;}
public string abab {get;set;}
public string cxcx {get;set;}
public Role2(string lala, string abab, string cxcx)
{
}
public List<Role2> GetMembers()
{
return dataaccesslayer.GetRole2Members();
}
}
public class Role3
{
public string lala {get;set;}
public string abab {get;set;}
public string cxcx {get;set;}
public Role3(string lala, string abab, string cxcx)
{
}
public List<Role3> GetMembers()
{
return dataaccesslayer.GetRole3Members();
}
}
在数据访问层中,将成员从按角色名称的字符串值筛选的SharePoint列表中拉出。例如“ Role1”
我试图创建这样的通用类实现:
public class Role
{
public string lala {get;set;}
public string abab {get;set;}
public string cxcx {get;set;}
public RoleType RoleType {get;set;}
public Role(RoleType roletype, string lala, string abab, string cxcx)
{
}
public static List<T> GetMembers<T>(ref T roletype,... )
{
return dataaccesslayer.GetRoleMembers<T>(roletype,...);
}
}
在数据层类中:
public List<T> GetMembers<T>(ref T roletype,...)
{
....
return....
}
但是编译器抛出的GetMembers有一些无效的参数。...
我错过了什么?
谢谢。
答案 0 :(得分:3)
如果将类分为两部分-角色定义和提供角色成员的内容,则通用实现更有意义。也许是这样的:
public class Role
{
public string lala { get; set; }
public string abab { get; set; }
public string cxcx { get; set; }
}
// Very likely this could just be an interface. There's not much use for
// an abstract class that doesn't implement anything. It effectively *is*
// an interface.
public abstract class RoleMembersProvider<TRole> where TRole : Role
{
public abstract List<TRole> GetMembers();
}
public class Role1MemberProvider : RoleMemberProvider<Role1>
{
public override List<Role1> GetMembers()
{
return dataaccesslayer.GetRole1Members();
}
}
但是,这个问题的直接答案导致了其他一些问题。
所有角色实际上都具有相同的属性吗?如果是这样,它们是否甚至需要成为单独的类?您能上一堂Role
课吗?如果您具有三个类(Role1
,Role2
,Role3
)并且它们都是相同的,那么区别它们的唯一一件事就是它们的类型,这反过来意味着您是使用类型作为数据。这可能会导致一些奇怪的通用行为,在这种行为中,您正在检查对象的类型,就像它是一个属性一样,以便您知道如何处理它。
如果它们不是单独的类,那么您是否需要多个类来获取角色的成员,还是可以只拥有一个类?
public class RoleMembersProvider
{
public List<Role> GetRoleMembers(string roleName)
{
// whatever
}
}
答案 1 :(得分:1)
如果它们相同,那么为什么不抽象类呢?
public abstract class Role
{
public string lala { get; set; }
public string abab { get; set; }
public string cxcx { get; set; }
public Role(string lala, string abab, string cxcx)
{
}
public abstract List<Role> GetMembers();
}