similares: Convert a string to Linq.Expressions or use a string as Selector?cómo convertir una cadena en una expresión linq?
una similar de aquel: Passing a Linq expression as a string?
Otra cuestión con la misma respuesta: How to create dynamic lambda based Linq expression from a string in C#?
razón de hacer algo que no tiene tantas preguntas similares:
El aceptada La respuesta en esas preguntas similares es inaceptable en el sentido de que todas hacen referencia a una biblioteca de hace 4 años (a condición de que haya sido escrita por el maestro de códigos Scott Gu) escrita para un viejo marco (.net 3.5), y no ovide algo más que un enlace como respuesta.
Hay una forma de hacer esto en el código sin incluir una biblioteca completa.
Aquí hay un código de ejemplo de esta situación:
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; }
}
Tenga en cuenta que esto no está tratando de convertir una cadena entera en una expresión como
query = "x => x.id == somevalue";
Pero en cambio es tratar de un solo uso la cadena como el acceso
query = x => x.STRING;
¿Ha descartado hacer simple reflejo de hacer tu 'Func'? –
@PaulPhillips - La reflexión arrojará el tipo de propiedad o el nombre de la propiedad en la clase T que se transfiere. La Clase T se pasa solo como referencia para el tipo cuando se conecta a un Repositorio de Entity Framework. Se devuelve una lista de todas las clases T del repositorio ('repo.getList()'). ¿Cómo ayudaría la reflexión a incluir propiedades de la Clase T en la expresión linq? –
Su ejemplo hizo que parezca que está haciendo linq-to-objects, en cuyo caso podría tomar el valor de la propiedad de forma reflexiva. Pero como trabajas en otro contexto, no estoy seguro de que funcione. Publiqué mi intento para que pudiera verificar –