2017-04-12 115 views
3

我在通用列表中獲取記錄時遇到問題。我創建了一個通用函數,我想從任何類的類中獲取記錄。以下是示例代碼: -從通用列表中查找項目

public void Test<T>(List<T> rEntity) where T : class 
{ 
    object id = 1; 
    var result = rEntity.Where(x => x.id == id); 
} 

請建議。提前致謝。

+4

,你會想到什麼'測試()'做什麼?或'Test ()'?在我看來,像你的'T'需要更多的約束... –

+2

這個代碼甚至不應該編譯,因爲T是一個類並不意味着T是一個對象的集合,它擁有一個名爲id的屬性。 –

+0

嗨,Jon,'T'是一個泛型類名,我們將在調用上述方法時傳遞。謝謝 –

回答

4

使用像編譯器通常的問題是'什麼是T'的方法? 如果它只是一個類,它可以是任何東西,即使是Jon提到的StringBuilder,也不能保證它有一個屬性「Id」。所以它甚至不會按照現在的方式進行編譯。

爲了使它的工作,我們有兩個選擇:

A)改變方法,讓編譯器知道會發生什麼類型

B)使用反射和使用運行時操作(如果可能更好地避免這種情況但在使用第三方庫時可能會很方便)。

A - 接口解決方案:

public interface IMyInterface 
{ 
    int Id {get; set;} 
} 

public void Test<T>(List<T> rEntity) where T : IMyInterface 
{ 
    object id = 1; 
    var result = rEntity.Where(x => x.id == id); 
} 

乙 - 反思的解決方案:

public void Test<T>(List<T> rEntity) 
{ 
    var idProp = typeof(T).GetProperty("Id"); 
    if(idProp != null) 
    { 
     object id = 1; 
     var result = rEntity.Where(x => idProp.GetValue(x).Equals(id)); 
    } 
} 
+0

中定義的類感謝Fabjan,您節省了我很多時間。反射解決方案正在爲我工​​作。再次感謝。 –

1

你最定義具有id屬性基本類和你的T大多數從基本類中繼承。

public class BaseClass{ 
public object ID; 
} 

,你可以改變你的函數是這樣的:

public void Test<T>(List<T> rEntity) where T : BaseClass 
{ 
    object id = 1; 
    var result = rEntity.Where(x => x.id == id); 
}