将多个对象类合并为通用类

时间:2018-07-05 18:07:35

标签: c# class generics

我正在维护一个现有的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有一些无效的参数。...

我错过了什么?

谢谢。

2 个答案:

答案 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课吗?如果您具有三个类(Role1Role2Role3)并且它们都是相同的,那么区别它们的唯一一件事就是它们的类型,这反过来意味着您是使用类型作为数据。这可能会导致一些奇怪的通用行为,在这种行为中,您正在检查对象的类型,就像它是一个属性一样,以便您知道如何处理它。

如果它们不是单独的类,那么您是否需要多个类来获取角色的成员,还是可以只拥有一个类?

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();
}