C#中的通用对象

4
我有一个小问题,需要一些帮助:)
例如,我有一个简单的抽象类。
public abstract class BaseDefinition
{
    public int Id { get;set; }
    public string Name { get;set; }
}

"和其他基类"
public abstract class BaseParentClass
{
    public string Name { get;set; }
    public string Schema { get;set; }
}

"第一个通用抽象类"
public abstrac class BaseParentClass<T> : 
    BaseParentClass where T : BaseDefinition
{
    public IList<T> Objects {get;set;}
}

"和初步实现"
public class ClassADefintion : BaseDefinition
{
    public bool IsChanged {get;set;}
}


public class ClassAObject : BaseParentClass<ClassADefinition>
{
     public bool OtherField {get;set;}
}

public class ClassBDefintion : BaseDefinition
{
    public bool IsBBBChanged {get;set;}
}

public class ClassBObject : BaseParentClass<ClassBDefinition>
{
     public bool OtherBBBBField {get;set;}
}

抱歉类名不好,但我无法创建更好的(这只是一个示例)。正如我们所看到的,现在一切都很好:)。
我有一些方法返回泛型实现的IEnumerable。
IEnumerable<ClassBObject> ClassBObjectCollection;
IEnumerable<ClassAObject> ClassAObjectCollection;

现在我必须创建一个方法,可以接受IEnumerable中的通用对象。
public void DoWork(IEnumerable<BaseParentClass<BaseDefinition>> objects)
{
    foreach(var baseObj in objects)
    {
        foreach(var baseDef in baseObj.Objects)
        {
            // do some work
        }
    }
}

我记得 BaseObject<BaseDefinition> != ClassAObject,但编译器没有显示任何错误。我记得在 .NET 中的泛型接口中,我们可以使用 IN 和 OUT T,所以我试着这样做。
public interface IBaseParentClass<out T> where T : BaseDefinition
{
    IList<T> Objects {get;set;}
}

没错,你无法创建一个 <out T> 的列表。有人对这个问题有什么想法吗?
我可以通过反射获取这些字段的值,但是我有抽象类和接口,所以我认为有更好的方法。
1个回答

2

我手头没有编译器,但我认为可以将DoWork重写如下:

public void DoWork<T>(IEnumerable<BaseObject<T>> objects) 
    where T : BaseDefinition
{
    foreach(var baseObj in objects)
    {
        foreach(var baseDef in baseObj.Objects)
        {
            // do some work
        }
    }
}

我不确定编译器是否能为你推断T的类型,请试一下。

另一个可能性是,如果你无论如何都要枚举这些对象,可以将它们转换为IEnumerable(Of T)类型的对象。


非常好用。它很简单,我自问为什么我之前没有想到通用方法:o谢谢 :) - user1091406

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接