Dan*_*can 2 c# object-oriented-analysis
我有两个班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);
Run Code Online (Sandbox Code Playgroud)
那么我缺少一个特定的语法吗?我应该使用像Abstracts这样的东西吗?
对不起,这只是导致我头疼一段时间的事情之一,并希望一个优雅的解决方案.
List<T>不是协变的,你的方法只适用于IEnumerable<>:
public string CombineAllFields(IEnumerable<GenericNameValue> mylist)
{
.... do stuff with each item
}
Run Code Online (Sandbox Code Playgroud)
图书馆的完整定义:
public class List<T> : IList<T> { }
public interface IList<T> : IEnumerable<T> { }
public interface IEnumerable<out T> { }
Run Code Online (Sandbox Code Playgroud)
请注意,您的向下转换只能与使用该out修饰符的接口一起使用.
考虑使用a List<T>或IList<T>参数将允许您的方法更改List.删除无关紧要,但我们必须阻止添加GenericNameValue到a List<SpecificNameValue>.IEnumerable<>不会让你添加到一个集合,所以协方差是安全的.