c#中的泛型对象

本文关键字:对象 泛型 | 更新日期: 2023-09-27 18:19:42

我有一个小问题,需要一些帮助:)

例如,我有一个模拟抽象类

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>。有人知道这个问题吗?

我可以通过反射获得这些字段的值,但我有抽象的类和接口,所以我认为这是一种更好的方法。

c#中的泛型对象

我手头没有编译器,但我认为应该可以这样重写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)的对象。