Вопрос по reflection, c#, variables, string – Доступ к переменной с использованием строки, содержащей имя переменной [duplicate]

7

This question already has an answer here:

string to variable name 4 answers

Я читаю имя строковой переменной из базы данных (например, "_datafile"). Я хочу знать, как я могу получить доступ к именованной переменной в моей программе, используя эту строку.

Я уже пытался использовать словарь, хэш-таблицу и оператор switch-case, но я хотел бы, чтобы переменная разрешалась сама собой. Это возможно?

Error: User Rate Limit Exceededresolve dynamically? O. R. Mapper
Error: User Rate Limit Exceeded"_datafile" to become _datafile ? Olivier Jacot-Descombes
Error: User Rate Limit Exceeded Rick Price

Ваш Ответ

3   ответа
2

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);
Хм, да, это будет работать сDataFile, но не с_datafile, Вы должны удалитьvar f = typ.GetField("_datafile");
Хорошо, моя ошибка, я думал, что это работает только со свойствами, а не с полями. Но это действительно так.
Я не думаю, что это сработаетas is. _datafile должна быть собственность.
Вы должны быть в состоянии сделать то же самое со свойствами. Я добавил один к своему примеру.
Этот код работает в LinqPad, но только если поле является открытым, поэтому я согласен, что обычно вы не хотите получать доступ к полю таким способом. Это зависит от того, что ОП пытается сделать, хотя.
5

Error: User Rate Limit Exceeded

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:Error: User Rate Limit Exceeded

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);
        }
    }
}
это частично рабочая открытая статическая строка _dataFile; строковое значение = rdr.GetValue (rdr.GetOrdinal (& quot; Value & quot;)). ToString (); string result = this.GetType (). GetField (value, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public) .GetValue (this) .ToString (); это работает с сингулярными переменными, теперь я должен заставить его работать с коллекцией, например: коллекцией данных с именем _parameters, которую я бы искал для разрешения _parameters.From и т. д. Rick Price
Редактирование выше отвечает на ваш вопрос?
0

Error: User Rate Limit ExceededIDError: User Rate Limit ExceededFirstNameError: User Rate Limit ExceededLastNameError: User Rate Limit Exceeded

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

Error: User Rate Limit Exceeded

var people = new List<Person>();

Error: User Rate Limit Exceeded

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

Error: User Rate Limit Exceeded

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);
    }
}
Это не совсем понятно, но я думаю, что этот вопрос на самом деле касается отражения, а не доступа к базе данных ...

Похожие вопросы