2012-06-20 27 views
7

Estoy leyendo el nombre de una variable de cadena de la base de datos (por ejemplo, "_datafile"). Quiero saber cómo puedo acceder a una variable con nombre dentro de mi programa usando esta cadena.Accediendo a una variable usando una cadena que contiene el nombre de la variable

Ya he intentado utilizar un diccionario, una tabla hash y una declaración de cambio de mayúscula, pero me gustaría que la variable se resuelva de forma dinámica. es posible?

+4

Tu pregunta no está clara. ¿Puedes mostrar un código? ¿Cómo ha usado una declaración de mayúsculas y un diccionario, y qué quiere decir con * resolver dinámicamente *? –

+1

¿Qué quiere decir con '" _datafile "para convertirse en _datafile'? –

+0

aquí hay un fragmento de código junto con la definición del diccionario while (rdr.Read()) { string step = rdr.GetString (rdr.GetOrdinal ("Step")); string tag = rdr.GetValue (rdr.GetOrdinal ("Tag")). ToString(); string value = rdr.GetValue (rdr.GetOrdinal ("Value")). ToString(); AddDataToWorkflow (paso, etiqueta, SearchDictionary (valor)); } –

Respuesta

0

Normalmente crearía una clase que representara los valores de un registro de tabla. Si la tabla tiene un ID un FirstName y una columna LastName, debe crear una clase como esta

public class Person 
{ 
    public int ID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

A continuación, se crea una lista de personas

var people = new List<Person>(); 

Ahora puede agregar personas a la lista.

var p = new Person(); 
p.ID = 5; 
p.FirstName = "John"; 
p.LastName = "Doe"; 
people.Add(p); 

Puede utilizar un DataReader para leer desde una tabla

string sql = "SELECT * FROM tblPerson WHERE LastName LIKE @pattern"; 
cmd = new SqlCommand(sql); 
cmd.Connection = "server=test;uid=sa;pwd=manager;database=northwind"; 
cmd.Parameters.AddWithValue("@pattern", "A%"); // Names beginning with "A" 
using (SqlDataReader reader = cmd.ExecuteReader()) { 
    // Get column indexes 
    int idOrdinal = reader.GetOrdinal("ID"); 
    int firstNameOrdinal = reader.GetOrdinal("FirstName"); 
    int lastNameOrdinal = reader.GetOrdinal("LastName"); 

    while(reader.Read()) { 
     var p = new Person(); 
     p.ID = reader.GetInt32(idOrdinal); 
     p.FirstName = reader.GetString(firstNameOrdinal); 
     p.LastName = reader.GetString(lastNameOrdinal); 
     people.Add(p); 
    } 
} 
+0

No está del todo claro, pero creo que esta pregunta se trata en realidad de reflexión, no de acceso a la base de datos ... –

4

Qué quiere decir que desea obtener el valor de un campo con el nombre del campo como una cadena?

public class MyClass 
{ 
    public string _datafile; 

    public MyClass() 
    { 
     _datafile = "Hello"; 
    } 

    public void PrintField() 
    { 
     var result = this.GetType().GetField("_datafile").GetValue(this); 
     Console.WriteLine(result); // will print Hello 
    } 
} 

EDIT: @Rick, para responder a su comentario:

public class MyClass 
{ 
    public IEnumerable<string> _parameters = new[] { "Val1", "Val2", "Val3" }; 

    public void PrintField() 
    { 
     var parameters = this.GetType().GetField("_parameters").GetValue(this) as IEnumerable; 

     // Prints: 
     // Val1 
     // Val2 
     // Val3 
     foreach(var item in parameters) 
     { 
      Console.WriteLine(item); 
     } 
    } 
} 
+0

esto está funcionando parcialmente cadena pública _dataFile; string value = rdr.GetValue (rdr.GetOrdinal ("Value")). ToString(); string result = this.GetType(). GetField (value, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public) .GetValue (this) .ToString(); esto funciona con variables singulares, ahora tengo que hacer que funcione con una colección, por ejemplo: una colección de datos llamados _parameters que buscaría resolver _parameters.From, etc. –

+0

¿La edición de arriba responde a su pregunta? –

2

Si desea obtener el valor de un campo en función de su nombre de la cadena tendrá que utilizar la reflexión.

class MyClass 
{ 
    public int DataFile { get; set; } 

    public int _datafile; 
} 

var ob = new MyClass(); 
var typ = typeof(MyClass); 
var f = typ.GetField("_datafile"); 
var prop = typ.GetProperty("DataFile"); 
var val = f.GetValue(ob); 
var propVal = prop.GetValue(ob); 
+0

No creo que funcione _como es_. '_datafile' necesita ser una propiedad. – Otiel

+0

Debería poder hacer lo mismo con las propiedades. He agregado uno a mi ejemplo. –

+0

Hmm, sí, funcionará con 'DataFile', pero no con' _datafile'. Debe eliminar 'var f = typ.GetField ("_ archivo de datos"); ' – Otiel

Cuestiones relacionadas