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
}