類似:Convert a string to Linq.Expressions or use a string as Selector?如何將一個字符串轉換爲linq表達式?
類似的一個之一:Passing a Linq expression as a string?
用相同的回答另一個問題:How to create dynamic lambda based Linq expression from a string in C#?
原因,詢問一些東西,有這麼多的類似的問題:
接受的在這些類似的問題中回答是不可接受的,因爲它們都參考了一個4年前的圖書館(假設它是由代碼大師Scott Gu編寫的)爲舊框架(.net 3.5)編寫的,並且不提供作爲答案,除了鏈接以外,什麼都不願意。
有一種方法可以在不包含整個庫的情況下在代碼中執行此操作。
下面是這種情況的一些示例代碼:
public static void getDynamic<T>(int startingId) where T : class
{
string classType = typeof(T).ToString();
string classTypeId = classType + "Id";
using (var repo = new Repository<T>())
{
Build<T>(
repo.getList(),
b => b.classTypeId //doesn't compile, this is the heart of the issue
//How can a string be used in this fashion to access a property in b?
)
}
}
public void Build<T>(
List<T> items,
Func<T, int> value) where T : class
{
var Values = new List<Item>();
Values = items.Select(f => new Item()
{
Id = value(f)
}).ToList();
}
public class Item
{
public int Id { get; set; }
}
注意,這並不打算把整個字符串轉換成表達式,比如
query = "x => x.id == somevalue";
但取而代之的是試圖只使用字符串作爲訪問
query = x => x.STRING;
你有沒有排除了做簡單的反射讓你的'Func'? – 2012-07-13 23:41:11
@PaulPhillips - Reflection將產生傳入的類T中屬性的屬性類型或名稱。當連接到實體框架存儲庫時,類T僅作爲類型的引用傳遞。從存儲庫('repo.getList()')返回所有類T的列表。反射如何幫助包含linq表達式中類T的屬性? – 2012-07-13 23:45:47
您的示例使它看起來像是在執行linq-to-objects,在這種情況下,您可以反射性地獲取該屬性的值。但既然你在另一個環境下工作,我不確定它會起作用。我發佈了我的嘗試,所以你可以檢查 – 2012-07-13 23:47:09