我有一个小问题,我需要一些帮助:)
例如,我有一个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).