我有两个类GenericNameValue
和SpecificNameValue
,继承自GenericNameValue
。
我有一个带参数List<GenericNameValue>
的函数。我希望能够通过List<SpecificNameValue>
。该函数对SpecificNameValue
的特殊属性没有任何作用。
这样做的最佳方法是什么?
public class GenericNameValue
{
public string FieldName{get;set;}
public string FieldValue{get;set;}
}
public class SpecificNameValue : GenericNameValue
{
public string SpecificFieldValue{ get; set; }
}
public static UtitlityClass
{
public string CombineAllFields(List<GenericNameValue> mylist)
{
//.... do stuff with each item
}
}
//......Example of calling the utilityclass
string stuff = UtilityClass.CombineAllFields(mySpecificNameValue);
那么我缺少一个特定的语法吗?我应该使用像Abstracts这样的东西吗?
对不起,这只是导致我头疼一段时间的事情之一,并且想要一个优雅的解决方案。
答案 0 :(得分:6)
List<T>
不是协变的,您的方法仅适用于IEnumerable<>
:
public string CombineAllFields(IEnumerable<GenericNameValue> mylist)
{
.... do stuff with each item
}
图书馆的完整定义:
public class List<T> : IList<T> { }
public interface IList<T> : IEnumerable<T> { }
public interface IEnumerable<out T> { }
请注意,您的下载广告只适用于使用该out
修饰符的界面。
考虑使用List<T>
或IList<T>
参数可以让您的方法更改List。删除无关紧要,但我们必须阻止向GenericNameValue
添加List<SpecificNameValue>
。 IEnumerable<>
不会让您添加到集合中,因此协方差是安全的。
答案 1 :(得分:1)
Henk Holterman 的答案肯定是要走的路。
如果您使用的是List<T>
,或者您使用的是 .NET 2.0 或 3.0 ,则可以选择使用通用参数有约束:
public static string CombineAllFields<T>(List<T> mylist) where T : GenericNameValue
{
//.... do stuff with each item
}