列表的面向对象编程问题

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这样的东西吗?

对不起,这只是导致我头疼一段时间的事情之一,并希望一个优雅的解决方案.

Hen*_*man 6

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<>不会让你添加到一个集合,所以协方差是安全的.