Si tengo un LINQ declaración como

x = Table.SingleOrDefault(o => o.id == 1).o.name;

cómo se puede reemplazar el «id» y «name» con pasado en las variables de uso de la reflexión? Sigo recibiendo referencia a objeto no establecida como instancia de un objeto errores cuando intento. Mis intentos son cosas como

x = (string)Table.SingleOrDefault(o => (int?)o.GetType().GetProperty(idString)
.GetValue(o, null) == 1).GetType().GetField(nameString).GetValue(x);

Cualquier ayuda sería genial. Gracias.

  • Lo siento, yo no podía entender su problema o incluso el código :(. Podría rehacer la pregunta del cuerpo?
  • ¿cuál es p en GetValue ?
  • un error tipográfico. debe ser o. Va a editar.
  • ¿Qué tipo de LINQ es? LINQ to Objects, LINQ to entities, LINQ to SQL?
  • Intenta especificar BindingFlags.Instance | BindingFlags.Public como la unión de las banderas
  • LINQ to Objects

InformationsquelleAutor erosebe | 2014-05-22

2 Comentarios

  1. 25

    Debe utilizar Árboles de Expresión en lugar de la reflexión. Se obtienen mejores resultados, y usted será capaz de utilizarlo con LINQ to Objects y LINQ to SQL/Entidades.

    var source = new List<Test> { new Test { Id = 1, Name = "FirsT" }, new Test { Id = 2, Name = "Second" } };
    var idName = "Id";
    var idValue = 1;
    
    var param = Expression.Parameter(typeof(Test));
    var condition =
        Expression.Lambda<Func<Test, bool>>(
            Expression.Equal(
                Expression.Property(param, idName),
                Expression.Constant(idValue, typeof(int))
            ),
            param
        ).Compile(); //for LINQ to SQl/Entities skip Compile() call
    
    var item = source.SingleOrDefault(condition);

    a continuación, usted puede conseguir Name de la propiedad mediante la reflexión (que voy a hacer sólo una vez, así que está bien para hacer uso de la reflexión.

    var nameName = "Name";
    var name = item == null ? null : (string) typeof(Test).GetProperty(nameName).GetValue(item);

    Test clase se define como

    public class Test
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    • Esto funciona muy bien. Sólo una pequeña modificación en el código y se hace lo que yo quería. Gracias.
    • Esto es EXACTAMENTE lo que yo estaba buscando. Gracias.
  2. 1

    Usted no puede utilizar la reflexión, pero puede utilizar la dinámica de Linq como se describe aquí. Si usted está usando Entity Framework para esto, usted debe también ser capaz de utilizar Entity SQL, que es básicamente una rígida cadena SQL.

    • Tal vez podría reescribir el uso de expresiones lambda. Pero no estoy seguro de que él necesita.
    • La manera más simple. Especialmente para Entity framework

Dejar respuesta

Please enter your comment!
Please enter your name here