微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c#中的通用对象

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

例如,我有一个simle抽象类

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>.有人对这个问题有任何想法吗?

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

解决方法

我手头没有编译器,但我认为应该可以重写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).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐