Simile: Convert a string to Linq.Expressions or use a string as Selector?come trasformare una stringa in un'espressione linq?
uno simile di quello: Passing a Linq expression as a string?
Un'altra domanda con la stessa risposta: How to create dynamic lambda based Linq expression from a string in C#?
Motivo per chiedere qualcosa che ha così tante domande simili:
La accettato rispondere a quelle domande simili è inaccettabile in quanto tutte fanno riferimento a una libreria di 4 anni fa (a condizione che sia stata scritta dal codice master Scott Gu) scritta per un vecchio framework (.net 3.5), e non pr Ovidio tutto tranne un link come risposta.
C'è un modo per farlo nel codice senza includere un'intera libreria.
Ecco alcuni esempi di codice per questa situazione:
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; }
}
Nota che questo non sta cercando di trasformare un'intera stringa in un'espressione come
query = "x => x.id == somevalue";
Ma invece sta cercando di solo per uso la stringa come accesso
query = x => x.STRING;
hai escluso facendo semplice riflessione per fai il tuo 'Func'? –
@PaulPhillips - Reflection produrrà il tipo di proprietà o il nome della proprietà nella classe T che viene inoltrata. La classe T viene passata solo come riferimento per il tipo quando si effettua la connessione a un repository di Entity Framework. Un elenco di tutte le classi T viene restituito dal repository ('repo.getList()'). In che modo la riflessione aiuta a includere le proprietà della classe T nell'espressione linq? –
Il tuo esempio ha fatto sembrare che stai facendo linq-to-objects, nel qual caso potresti prendere il valore della proprietà in modo riflessivo. Ma dal momento che lavori in un altro contesto, non sono sicuro che funzionerebbe. Ho postato il mio tentativo in modo da poter controllare –