c# - 将多个对象类合并为通用类
问题描述
我正在维护一个现有的 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 列表中提取的。示例“角色 1”
我试图创建一个这样的通用类实现:
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 有一些无效的参数....
我错过了什么?
谢谢。
解决方案
如果您将类分成两部分 - 角色的定义和提供角色成员的东西,通用实现会更有意义。也许是这样的:
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
}
}
推荐阅读
- c - 这是在中型项目中实现封装的有效 OOP 替代方案吗?
- google-cloud-platform - GCP Google Cloud Storage:避免昂贵的数据传出网络出口
- java - java.util.Collections#copy 方法在 kotlin 中的外观如何?
- api - 我应该使用 OAuth 让 SPA 与后端通信吗?
- java - 如何在开头将标题设置为 PDF 以及如何设置居中对齐
- android - Firebase ML 智能回复支持哪些语言?
- python - Selenium 滚动到页面底部偶尔会停止
- kotest - 在类级别或容器级别设置标签
- bash - 获取所有aws帐号并排除脚本执行期间传递的帐号
- bash - 在 xmlstarlet 中删除具有多个条件的 xml 元素