如何使方法c#具有List <dto>参数的通用方法

时间:2018-07-09 07:58:19

标签: c#

需要创建将接受List<child1>List<child2>的通用方法。

public class Parent
{
    public string Name { get; set; }
    public decimal ProductRate { get; set; }
}

public class Child1 : Parent
{

}

public class Child2 : Parent
{

}

程序:如下所示,我试图在方法中传递值

public class HelloFriend
{
    public static void Main(string[] args)
    {
        List<Child1> child1 = new List<Child1>()
        {
            new Child1(){ Name="Admin", ProductRate = 10}
        };

        List<Child2> child2 = new List<Child2>()
        {
            new Child2(){ Name="Admin", ProductRate = 50}
        };

        decimal result1 =  getvalues(child1, 10);
        decimal result2 =  getvalues(child2, 10);
    }

    public static decimal getvalues(List<Child1> list, decimal calculateValue)
    {
        decimal value = 1;

        if(parentList !=null )
        {
            foreach( var item in parentList)
            {
                value = item.ProductRate * 100 * calculateValue;
            }
        }
        return value;
    }
}

如何制作适用于所有Child1和Chil2列表的getvalues()泛型

2 个答案:

答案 0 :(得分:1)

有关继承的基本知识:使用Parent列表并声明 Parent中所需的获取器/设置器(就像您所做的那样)。

public static decimal getvalues(List<Parent> list, decimal calculateValue)
{

}

正如评论所说,用法:(将“父级”用作列表类型)

List<Parent> child1 = new List<Parent>()
{
    new Child1(){ Name="Admin", ProductRate = 10}
};
decimal result1 =  getvalues(child1, 10);

替代:(列出子列表)

List<Child1> child1 = new List<Child1>()
{
    new Child1(){ Name="Admin", ProductRate = 10}
};
decimal result1 =  getvalues(child1.Cast<Parent>(), 10);

答案 1 :(得分:1)

一个简短的控制台项目,在这里说明泛型的用法: [我使用了您问题的对象定义]

static void Main()
{
    List<Child1> child1s = new List<Child1>()
    {
        new Child1() { Name="c11", ProductRate=1},
        new Child1() { Name="c12", ProductRate=2}
    };

    List<Child2> child2s = new List<Child2>()
    {
        new Child2() { Name="c21", ProductRate=30},
        new Child2() { Name="c21", ProductRate=60}
    };

    foreach (var retval in GetValues(child1s, 5))
        System.Console.WriteLine(retval);
    foreach (var retval in GetValues(child2s, 5))
        System.Console.WriteLine(retval);

    System.Console.ReadKey();
}
public static IEnumerable<decimal> GetValues<T>(List<T> items, decimal calculatedValue) where T : Parent
{
    foreach (var item in items)
    {
        yield return (decimal)(item.ProductRate * 100 * calculatedValue);
    }
}

该函数定义为List<T>,其中T是通用类型参数。 where T : Parent进一步限制了此参数,使其仅适合类型为Parent或它的继承类型的对象。

如果需要,您还可以通过typeof(T)来获取给定实例的类型,以进行区分,但是对于这种类型,您应该首先深入了解泛型。

另一种方式是如在KYL3R的答案中所述,将输入参数定义为IEnumerable<Parent>(在他的答案List<Parent>中)。这样,您就不需要泛型,只需继承和隐式转换。您需要在这里IEnumerable<T>,否则对话不是隐式的,必须手动进行。

static void Main()    
{
    .....
    foreach (var retval in GetValues(child1s, 5))
        System.Console.WriteLine(retval);
    foreach (var retval in GetValues(child2s, 5))
        System.Console.WriteLine(retval);

    System.Console.ReadKey();
}
public static IEnumerable<decimal> GetValues(IEnumerable<Parent> items, decimal calculatedValue)
{
    foreach (var item in items)
    {
        yield return (decimal)(item.ProductRate * 100 * calculatedValue);
    }
}

也请注意我返回的项目列表(IEnumerable<decimal>)和yield return语句的返回值。我认为您在处理列表后的单个返回值是一个错误。而且我使用IEnumerable来明确表示我不修改给定的集合。