C# 使用实现IList的类重构方法<;T>;

C# 使用实现IList的类重构方法<;T>;,c#,.net-3.5,C#,.net 3.5,我们使用.NET Framework 3.5制作了一些类,如下所示: public class A { public override string ID { get; set; } public override string Name { get; set; } private List<B> versionen = new List<B>(); public List<B> Versionen {

我们使用.NET Framework 3.5制作了一些类,如下所示:

public class A 
{
    public override string ID { get; set; }
    public override string Name { get; set; }
    private List<B> versionen = new List<B>();
    public List<B> Versionen
    {
        get { return versionen; }
        set { versionen = value; }
    }
}
公共A类
{
公共重写字符串ID{get;set;}
公共重写字符串名称{get;set;}
私有列表版本n=新列表();
公共列表版本
{
获取{return versionen;}
设置{versionen=value;}
}
}
由其他类中的方法使用,如

private static void DoSomething(List<A> versioningObj)
{
    foreach (A concretClassAObject in versioningObj)
    {
        foreach (B concretClassAVersionObject in concretClassAObject.Versionen)
        {
        }
    }
}
private static void DoSomething(列表版本ingobj)
{
foreach(versioningObj中的具体类对象)
{
foreach(concretClassAObject.Versionen中的B concretClassAVersionObject)
{
}
}
}
为了重构此代码并开发一个通用方法,我尝试实现以下接口:

public interface VersioningObject<T> : IIDIdentifiable where T : IIDIdentifiable
{
    string Name { get; set; }
    List<T> Versionen { get; set; }
}

public interface IIDIdentifiable
{
    string ID { get; set; }
}
公共接口版本对象:IIDIdentifiable其中T:IIDIdentifiable
{
字符串名称{get;set;}
列表版本n{get;set;}
}
可识别的公共接口
{
字符串ID{get;set;}
}

类A实现“VersioningObject”,类B实现“IIDDIdentifiable”。新方法如下所示:

private static void DoSomething(List<VersioningObject<IIDIdentifiable>> versioningObj)
{
    foreach (VersioningObject<IIDIdentifiable> concretClassAObject in versioningObj)
    {
        foreach(IIDIdentifiable concretClassAVersionObject in concretClassAObject.Versionen) {
        }
    }
}
private static void DoSomething(列表版本ingobj)
{
foreach(VersioningObject中的VersioningObject ConcretClassAOObject)
{
foreach(concretClassAObject.Versionen中的可识别concretClassAVersionObject){
}
}
}
我尝试将此方法称为“DoSomething”,如下所示:

List<A> myList = new List<A>() {new A()};
DoSomething(myList);
List myList=new List(){new A()};
剂量测定法(myList);
并获取以下错误:

  • 无法将“System.Collection.Generic.List”转换为“System.Collection.Generic.List>”
    • DoSomeThing(System.Collections.Generic.List>)的最佳重载方法匹配具有一些无效参数

我怎样才能解决这个问题。提前非常感谢

无论是
List
还是
VersioningObject
都不与它们的泛型参数相关。因此,
VersioningObject
不能隐式转换为
VersioningObject
(其中
Child
扩展了
Parent
)。即使它是(目前它不能协变,因为它接受泛型参数作为输入),那么
列表
仍然不能隐式转换为
列表

要完成所有这些,您需要进行几个相当基本的重构

1)
VersioningObject
只需公开如何读取值,而不是写入值,从而使其在概念上变得协变:

public interface VersioningObject<out T> : IIDIdentifiable where T : IIDIdentifiable
{
    string Name { get; }
    List<T> Versionen { get; }
}

此外,通用协方差仅在.NET 4.0中添加,因此您需要使用该版本的框架,才能将其中任何一项作为选项。

您的问题毫无意义。首先什么是
B
?其次,
DoSomething
具有无效返回类型?如果您将
T
限制为
iidentifiable
,为什么要使用泛型
VersioningObject
?为什么不让
VersioningObject
有一个
列表Versionen
?顺便说一句,标题有点误导。没有一个类正在实现IList
IList
。很抱歉,有两项不正确:类A实现“版本控制”,对方法的调用必须是:DoSomething(myList);非var测试=剂量测定(myList);'B’只是一个实现IIDIdentifiable的类
private static void DoSomething(
    IEnumerable<VersioningObject<IIDIdentifiable>> versioningObj)
{
   //...
}