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