需要创建将接受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()泛型
答案 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
来明确表示我不修改给定的集合。