2010-05-07 11 views
5
public class Foo 
{ 
    public string Name { get; private set;} // <-- Because set is private, 
} 

void Main() 
{ 
    var bar = new Foo {Name = "baz"}; // <-- This doesn't compile 
    /*The property or indexer 'UserQuery.Foo.Name' cannot be used 
     in this context because the set accessor is inaccessible*/ 

    using (DataContext dc = new DataContext(Connection)) 
    { 
     // yet the following line works. **How**? 
     IEnumerable<Foo> qux = dc.ExecuteQuery<Foo>(
      "SELECT Name FROM Customer"); 
    } 
    foreach (q in qux) Console.WriteLine(q); 
} 

No he estado utilizando el modificador privada, ya que funciona y me mantuvo de ser estúpido con mi código, pero ahora que tengo que crear una nueva Foo, acabo eliminó el modificador privado de mi propiedad. Solo tengo curiosidad, ¿por qué el ExecuteQuery se convierte en un trabajo de IEnumerable of Foo?propiedades de inicialización con conjuntos particulares en .Net

EDITAR Ok, por lo que el modificador privada no puede ver la reflexión de la incubadora, y de las respuestas, parece que ExecuteQuery (o es el contexto de datos?) Utiliza la reflexión para obtener los nombres de propiedad e ignora el modificadores. ¿Hay alguna manera de verificar eso? ¿Cómo podría haberlo descubierto por mi cuenta? (Adición de reflexión a la lista de etiquetas)

Respuesta

4

Crear un constructor de Foo que acepta un valor de "Nombre":

public class Foo 
{ 
    public Foo(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; private set; } 
} 

Ahora la construcción de su Foo así:

var bar = new Foo("baz"); 

Editar (leer el resto de su pregunta)

Mi conjetura es que ExecuteQuery utiliza la reflexión para inspeccionar la clase y encontrar sus propiedades. Probablemente no le importe que el colocador en Name sea privado, solo que Name tiene un setter.

+0

Esto es correcto. Puede obtener fácilmente el método privado setter de un 'PropertyInfo' utilizando' GetSetMethod (true) '. Estoy bastante seguro de que esto es lo que hace Linq to SQL. – Aaronaught

1

La consulta se evalúa contra un almacén de datos, que no tiene un concepto de público o privado. E incluso en el código, es posible acceder a miembros privados utilizando una técnica llamada Reflection.

4

aquí es simple fragmento de código que ilustra este tipo de comportamiento:

class Blah { 
    public string Property { get; private set; } 
} 

var blah = new Blah(); 
typeof(Blah).GetProperty("Property").SetValue(blah, "newValue", null); 
// at this stage blah.Property == "newValue" 
+0

muy útil, gracias –

Cuestiones relacionadas