如何传递不同类型的列表<;T>;转换成一种按相似字段进行分组的方法

本文关键字:相似 一种 字段 方法 列表 同类型 何传递 lt 转换 gt | 更新日期: 2023-09-27 18:29:43

我想创建一个通用方法,它将接受具有相似字段的不同类型的列表,我可以根据这些列表进行分组。

例如,我有两个列表:

 - List<MemberPurchases> Purchases 
 - List<MemberReturns> Returns

我想要一个方法,它将接受两种不同类型的列表,然后用类似的字段对它们进行分组:(Purchases.MemberID或Returns.MemberID).

这是我所拥有的,但它不会让我在传入时对列表进行任何linq查询:

Public static int GetMemberActivity<T>(List<T> memberList)
{
    var groupedList = memberList.GroupBy(x => x.  
}

在这一点上,我只得到四个选项(它们都不是列表中的元素):

  1. Equals
  2. GetHashCode
  3. GetType
  4. ToString

我要找的是:

var groupedList = memberList.GroupBy(x => x.MemberID);

如何修复此问题,以便通过LINQ传入任何具有MemberID元素和组的列表。

如何传递不同类型的列表<;T>;转换成一种按相似字段进行分组的方法

定义一个具有类似属性的接口,然后类可以实现它:

public interface IMember
{
    int MemberID { get; set; }
}
public class MemberPurchases : IMember
{
    public int MemberID { get; set; }
    public string SomeProperty { get; set; }
}
public class MemberReturns : IMember
{
    public int MemberID { get; set; }
    public string AnotherProperty { get; set; }
}

然后在你的方法中使用这个接口:

public static int GetMemberActivity(List<IMember> memberList)
{
    var groupedList = memberList.GroupBy(x => x.MemberID);
    return groupedList.Count();  // I'm just guessing what you want to return here
}

将列表投射到接口,然后将其传递给方法:

var result = GetMemberActivity(Purchases.ToList<IMember>());

您应该有一个公共接口,并接受该公共接口的强类型列表。

public interface IMember
{
    int MemberID { get; set; }
}
public class MemberPurchases : IMember
{
    public int MemberID { get; set; }
    //...
}
public class MemberReturn : IMember
{
    public int MemberID { get; set; }
    //...
}

所以你可以有:

public static int GetMemberActivity(List<IMember> memberList)
{
    var groupedList = memberList.GroupBy(x => x.MemberID);  
}

(1)几种可能的方法,灵活,但未强制执行类型安全

  1. 使用反射提取MemberID的值
  2. 检查传递对象的类型(例如使用isas语句),将泛型对象强制转换为正确的类型,然后直接访问该属性
  3. 在ObjectQuery中使用GroupBy方法,该方法具有用于对键进行分组的字符串参数。当然,您需要将方法参数类型从List更改为其他类型

(2) 推荐的类型安全方式-->定义一个新接口以获取MemberID值,然后将其应用于MemberPurchases和MemberReturns。由于这些类是由EF作为分部生成的,您可以创建一个新的同名分部类文件,然后实现接口。(分部类意味着一个类可以有多个源文件来描述同一个类,因此您可以直接扩展该类)。下面是新创建的.cs文件中的一个代码示例:

public interface IMember
{
    object MemberGenericID{get;}
}
public partial class MemberPurchases : IMember
{
    object IMember.MemberGenericID
    {
        get { return MemberID; }
    }
}
public partial class MemberReturns : IMember
{
    object IMember.MemberGenericID
    {
        get { return MemberID; }
    }   
}

然后你可以这样做:

    void Group(List<IMember> list)
    {
        list.GroupBy(x => x.MemberGenericID)
    }