尝试制定通用方法时出现问题

时间:2018-09-06 10:01:41

标签: c#

我正在尝试重构一些代码。所以我要重构的代码是这个

var userApp = string.Join(",", items.Where(x => x.LicenseType == 1).Select(x => x.GroupName));

var groupApp = string.Join(",", items.Where(x => x.LicenseType == 2).Select(x => x.GroupName));

var totalUsedLicense = GetTotalFreeLicense(schoolCode, userApp, groupApp);

foreach (var item in totalUsedLicense)
{
    items.FirstOrDefault(x => x.GroupName == item.GroupName).AvailableLicense = items.FirstOrDefault(x => x.GroupName == item.GroupName).TotalLicense - item.Count;
}

项目类型可以为List<ApplicationListDto>List<AdUserApplicationDto>-它们都继承自BaseApplicationDto, 通用属性在哪里。

现在,我想创建一个函数,在该函数中可以将项目作为参数传递。我该怎么办?

我正在尝试摆脱这里的多余代码

if (isList) 
{
    if (data.Count <= 0) return;

    List<AdUserApplicationDto> userApplicationDto = data;

    var items = userApplicationDto;

    var userApp = string.Join(",", items.Where(x => x.LicenseType == 1).Select(x => x.GroupName));
    var groupApp = string.Join(",", items.Where(x => x.LicenseType == 2).Select(x => x.GroupName));

    var totalUsedLicense = GetTotalFreeLicense(schoolCode, userApp, groupApp);

    foreach (var item in totalUsedLicense)
    {
        items.FirstOrDefault(x => x.GroupName == item.GroupName).AvailableLicense = items.FirstOrDefault(x => x.GroupName == item.GroupName).TotalLicense - item.Count;
    }
}
else
{
    Page<ApplicationListDto> userApplicationDto = data;

    if (userApplicationDto.TotalItems <= 0) return;

    var items = userApplicationDto.Items;



    var userApp = string.Join(",", items.Where(x => x.LicenseType == 1).Select(x => x.GroupName));
    var groupApp = string.Join(",", items.Where(x => x.LicenseType == 2).Select(x => x.GroupName));

    var totalUsedLicense = GetTotalFreeLicense(schoolCode, userApp, groupApp);

    foreach (var item in totalUsedLicense) {
        items.FirstOrDefault(x => x.GroupName == item.GroupName).AvailableLicense = items.FirstOrDefault(x => x.GroupName == item.GroupName).TotalLicense - item.Count;
    }

}

2 个答案:

答案 0 :(得分:1)

您将基类的类型用作列表的类型。

public abstract class Common
{
    public string CommonString { get; set; }
}

public class B : Common
{

}


public class A : Common
{

}

public class ABConsumer
{
    public void DoSomething(List<Common> myList)
    {
        List<Common> EmptyStrings = myList.Where(x => x.CommonString == string.Empty).ToList();
    }
}

您现在可以访问两个类的基类的属性。

这是简单的继承。

编辑

在将其传递之前,需要将其强制转换为任何给定类型:A或B到Common。如果强制转换是一个问题,则可以使用使用条件泛型的另一个好示例,如@ikkentims答案所示。

答案 1 :(得分:1)

如果您希望某个方法接受具有通用基本类型的不同列表类型,请执行以下操作:

public void SomeAction<T>(List<T> list) where T : BaseApplicationDto
{
    // ...
}