2013-02-12 48 views
0

當只有對象發生更改時,對於相同類型的過程,我幾乎沒有功能。 我試圖給這組方法寫泛型函數,但沒有得到T的ID。使用泛型進行重構

你能幫我重構一下嗎?

List<ObjectOfSomeKind> allObjects = new List<ObjectOfSomeKind>() { new ObjectOfSomeKind{ ID = 1}, new ObjectOfSomeKind { ID = 2 }}; 
List<ObjectOfSomeKind> objects = new List<ObjectOfSomeKind>(); 
      for (int i = 0; i < ids.Count(); i++) 
      { 
       int id = ids.ElementAt(i); 
       ObjectOfSomeKind object = allObjects .Where(item => item.ID.Equals(id)).SingleOrDefault(); 
       if (object == null) 
       { 
        throw new Exception("error"); 
       } 

       objects.Add(object); 
      } 
+0

'新的對象{ID = 1}'是無效。除非你創建了一個名爲'Object'的類?在這種情況下,不要那樣做。 – 2013-02-12 08:40:58

+0

Object = ObjectOfSomeKind – eugeneK 2013-02-12 08:41:45

+0

命名對於程序員來說非常重要。好主意學習它,並且快! – 2013-02-12 09:01:09

回答

1

定義一個ID屬性界面(或基類)

public interface IEntity 
{ 
    int ID { get; set; } 
} 

通過你的類

public class Foo : IEntity 
{ 
    public int ID { get; set; } 
} 

,如果你想實現這個接口,那麼無論是在你的代碼中使用IEntity,或(使用泛型)添加約束到您的泛型類或方法

where T : IEntity 

更新如果您所有的類都具有ID屬性,你也可以使用dynamic對象(有時也有解決方案,但我更喜歡編譯時檢查):

List<dynamic> allObjects = new List<dynamic>() { 
    new ObjectOfSomeKind{ ID = 1}, new ObjectOfSomeKind { ID = 2 }}; 
List<dynamic> objects = new List<dynamic>(); 

for (int i = 0; i < ids.Count(); i++) 
{ 
    int id = ids.ElementAt(i); 
    dynamic obj = allObjects.Where(item => item.ID.Equals(id)).SingleOrDefault(); 
    if (obj == null)     
     throw new Exception("error");     

    objects.Add(obj); 
} 
+0

是的,這是我的第一個想法,但無論如何,避免通用接口? – eugeneK 2013-02-12 08:42:46

+0

@eugeneK nope,沒有合法的方式(我的意思是沒有反思)。爲了有共同的財產,類應該有共同的接口(或基類) – 2013-02-12 08:43:16

+0

很酷,謝謝。這次避免反思。 – eugeneK 2013-02-12 08:45:44