2

我有两个类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 这样的不同的东西吗?

抱歉,这只是让我头疼一阵子的事情之一,我想要一个优雅的解决方案。

4

2 回答 2

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修饰符的界面一起使用。

考虑使用 aList<T>IList<T>参数将允许您的方法更改列表。删除无关紧要,但我们必须防止将 a 添加GenericNameValue到 a List<SpecificNameValue>IEnumerable<>不会让您添加到集合中,因此协方差是安全的。

于 2013-09-27T16:16:19.203 回答
1

Henk Holterman的回答绝对是要走的路。

如果您打算使用 aList<T>或者您在.NET 2.03.0中,则可以选择使用带有约束的泛型参数:

public static string CombineAllFields<T>(List<T> mylist) where T : GenericNameValue
{
    //.... do stuff with each item
}
于 2013-09-27T16:31:01.330 回答