gpt4 book ai didi

c# - 列表的面向对象编程问题

转载 作者:行者123 更新时间:2023-11-30 20:01:22 26 4
gpt4 key购买 nike

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

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

最佳答案

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 的接口(interface)一起使用修饰符。

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

关于c# - 列表的面向对象编程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19055310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com