2012-01-08 67 views
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;} 
} 

对不起类的名字,但我不能创造更好的东西(这是唯一的例子) 正如我们看到的,现在一切OK了:)。

我有一些方法谁返回通用实现的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,所以我尽量让这个

public interface IBaseParentClass<out T> where T : BaseDefinition 
{ 
    IList<T> Objects {get;set;} 
} 

是啊,你不能做的<out T>列表。有人对这个问题有任何想法吗?

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

回答

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)。

+3

http://ideone.com/提供了一个随时可用的编译器。 – millimoose 2012-01-08 21:21:50

+0

工程很棒。这很简单,我问自己我怎么想不出通用的方法:0 谢谢:) – user1091406 2012-01-08 21:29:23

+0

@Inerdial很好! – flq 2012-01-08 21:58:29