我在通用列表中獲取記錄時遇到問題。我創建了一個通用函數,我想從任何類的類中獲取記錄。以下是示例代碼: -從通用列表中查找項目
public void Test<T>(List<T> rEntity) where T : class
{
object id = 1;
var result = rEntity.Where(x => x.id == id);
}
請建議。提前致謝。
我在通用列表中獲取記錄時遇到問題。我創建了一個通用函數,我想從任何類的類中獲取記錄。以下是示例代碼: -從通用列表中查找項目
public void Test<T>(List<T> rEntity) where T : class
{
object id = 1;
var result = rEntity.Where(x => x.id == id);
}
請建議。提前致謝。
使用像編譯器通常的問題是'什麼是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));
}
}
中定義的類感謝Fabjan,您節省了我很多時間。反射解決方案正在爲我工作。再次感謝。 –
你最定義具有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);
}
,你會想到什麼'測試()'做什麼?或'Test ()'?在我看來,像你的'T'需要更多的約束... –
這個代碼甚至不應該編譯,因爲T是一個類並不意味着T是一個對象的集合,它擁有一個名爲id的屬性。 –
嗨,Jon,'T'是一個泛型類名,我們將在調用上述方法時傳遞。謝謝 –