Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带列表的面向对象编程问题_C#_Object Oriented Analysis - Fatal编程技术网

C# 带列表的面向对象编程问题

C# 带列表的面向对象编程问题,c#,object-oriented-analysis,C#,Object Oriented Analysis,我有两个类GenericNameValue和SpecificNameValue,它们继承自GenericNameValue 我有一个函数,它接受参数List。我希望能够传入列表。该函数不处理SpecificNameValue的特殊属性 最好的方法是什么 public class GenericNameValue { public string FieldName{get;set;} public string FieldValue{get;set;} } public clas

我有两个类
GenericNameValue
SpecificNameValue
,它们继承自
GenericNameValue

我有一个函数,它接受参数
List
。我希望能够传入
列表
。该函数不处理
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);
公共类GenericNameValue
{
公共字符串字段名{get;set;}
公共字符串字段值{get;set;}
}
公共类SpecificNameValue:GenericNameValue
{
公共字符串SpecificFieldValue{get;set;}
}
公共静态UtitlityClass
{
公共字符串组合字段(列表mylist)
{
//…对每一项都做些事情
}
}
//……调用utilityclass的示例
string stuff=UtilityClass.CombineAllFields(mySpecificNameValue);
那么,我是否缺少一个特定的语法?我应该使用一些不同的东西,比如摘要吗

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

列表
不是协变的,您的方法将只使用一个
IEnumerable

公共字符串组合字段(IEnumerable mylist)
{
…对每一项都做些事情
}
库中的完整定义:

public class List<T> : IList<T> { }
public interface IList<T> : IEnumerable<T> { }
public interface IEnumerable<out T> { }
公共类列表:IList{}
公共接口IList:IEnumerable{}
公共接口IEnumerable{}
请注意,向下转换只能与使用该
out
修改器的界面一起使用

考虑使用
List
IList
参数将允许您的方法更改列表。删除并不重要,但我们必须防止在
列表中添加
GenericNameValue
IEnumerable
不允许添加到集合中,因此协方差是安全的。

Henk Holterman的答案肯定是正确的

如果设置为使用
列表
,或者使用.NET 2.0或3.0,则可以选择使用带有约束的常规参数:

public static string CombineAllFields<T>(List<T> mylist) where T : GenericNameValue
{
    //.... do stuff with each item
}
公共静态字符串组合字段(列表mylist),其中T:GenericNameValue
{
//…对每一项都做些事情
}

您能否提供一个示例,说明您希望如何获得mySpecificNameValue
?是否不清楚它是什么。mySpecificNameValue是SpecificNameValues@Khan它之所以有效,是因为
IEnumerable
是协变的。它可以与派生类型一起工作,但与提供的答案一起工作会很好,因为正如Henk提到的,IEnumerables是协变的。它允许您提供一个更派生的类型来代替基类型。@Khan-不,这个表达式可以转换为
IEnumerable
,我看不出有什么问题。眼见为实,这太棒了。
public static string CombineAllFields<T>(List<T> mylist) where T : GenericNameValue
{
    //.... do stuff with each item
}