2011-01-23 27 views
3

如何訪問通用方法內的對象的屬性?
我無法使用where T: A,因爲此方法將接收不同的對象,但所有對象都有一個共同的屬性可供使用。
(我也不能讓他們一個共同的接口)在通用方法中訪問對象的屬性

public class A 
{ 
    public int Number {get;set;} 
} 


List<A> listA = new List<A>{ 
       new A {Number =4}, 
       new A {Number =1}, 
       new A {Number =5} 
}; 

Work<A>(listA); 

public static void Work<T>(List<T> list1) 
{ 
    foreach(T item in list1) 
    { 
     do something with item.Number; 
    } 
} 

更新:我也需要設置屬性

+1

爲什麼你不能創建一個接口?聽起來像是一個設計問題。 – Philipp 2011-01-23 08:01:49

+0

試試看這裏http://stackoverflow.com/questions/4292740/get-property-from-a-generic-object-in-c – 2011-01-23 08:02:23

+0

一個接口應該是答案,否則你應該在你的foreach中測試這個類。 – 2011-01-23 08:07:22

回答

8

您有幾種選擇:

  • 做一個通用接口。
  • 使用反射。
  • 使用動態類型在.NET 4

我知道你說你不能做第一,但它的性能和可維護性最好的選擇,所以請選擇的人之前,如果可能重新考慮其他方法。請記住,即使您無法修改原始代碼,您仍然可以選擇第一個選項。例如,如果你的類是局部類可以實現在另一個文件中的接口:如果原始類沒有被定義爲

interface IHasNumber 
{ 
    int Number { get; set; } 
} 

partial class A : IHasNumber 
{ 
} 

文件1:

// Automatically generated code that you can't change. 
partial class A 
{ 
    public int Number { get; set; } 
} 

文件2部分你可以在它們周圍編寫實現接口的包裝類。

一旦你有共同的接口,你可以改變你的通用的限制,要求該接口:

where T : IHasNumber 
1

如果你不需要的列表 - 只是物品,我會用投影的方法:

static void Main() 
{ 
    List<A> listA = new List<A>{ 
      new A {Number =4}, 
      new A {Number =1}, 
      new A {Number =5} 
    }; 

    Work(listA.Select(a => a.Number)); 

} 
public static void Work(IEnumerable<int> items) 
{ 
    foreach (number item in items) 
    { 
     // do something with number; 
    } 
} 

如果你需要的資源列表 - 投影經由選擇的方法:

static void Main() 
{ 
    List<A> listA = new List<A>{ 
      new A {Number =4}, 
      new A {Number =1}, 
      new A {Number =5} 
    }; 

    Work(listA, a => a.Number); 

} 
public static void Work<T>(IList<T> list, Func<T, int> selector) 
{ 
    foreach (T obj in list) 
    { 
     int number = selector(obj); 
     // do something with number; 
    } 
} 
相關問題