首页 > 解决方案 > 将多个对象类合并为通用类

问题描述

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

我错过了什么?

谢谢。

标签: c#classgenerics

解决方案


如果您将类分成两部分 - 角色的定义和提供角色成员的东西,通用实现会更有意义。也许是这样的:

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
    }
}

推荐阅读