列表的面向对象编程问题

时间:2013-09-27 16:03:59

标签: c# object-oriented-analysis

我有两个类GenericNameValueSpecificNameValue,继承自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这样的东西吗?

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

2 个答案:

答案 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
}