代码之家  ›  专栏  ›  技术社区  ›  John

将多个对象类合并到泛型类中

  •  0
  • John  · 技术社区  · 6 年前

    我正在维护一个现有的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....
    }
    

    但是编译器throws getmembers有一些无效参数….

    我错过了什么?

    谢谢。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Scott Hannen    6 年前

    如果将类分为两部分(角色的定义和提供角色成员的内容),那么通用实现就更有意义了。也许是这样:

    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
        }
    }
    
        2
  •  1
  •   paparazzo    6 年前

    如果它们是相同的,那么为什么不使用抽象类呢?

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