Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用包含变量';姓名_C#_String_Variables_Reflection - Fatal编程技术网

C# 使用包含变量';姓名

C# 使用包含变量';姓名,c#,string,variables,reflection,C#,String,Variables,Reflection,我正在从数据库中读取字符串变量的名称(例如“_datafile”)。我想知道如何使用此字符串访问程序中的命名变量 我已经尝试过使用字典、哈希表和switch-case语句,但是我想让变量动态解析自己。这可能吗?通常,您会创建一个表示一个表记录值的类。如果您的表有IDFirstName和LastName列,则可以创建如下类 public class Person { public int ID { get; set; } public string FirstName { get;

我正在从数据库中读取字符串变量的名称(例如“_datafile”)。我想知道如何使用此字符串访问程序中的命名变量


我已经尝试过使用字典、哈希表和switch-case语句,但是我想让变量动态解析自己。这可能吗?

通常,您会创建一个表示一个表记录值的类。如果您的表有
ID
FirstName和
LastName
列,则可以创建如下类

public class Person
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
然后创建一个人员列表

var people = new List<Person>();

您可以使用DataReader从表中读取数据

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);
    }
}

您的意思是希望使用字段名作为字符串来获取字段的值吗

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
    }
}
编辑:@Rick,回复您的评论:

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);
        }
    }
}
公共类MyClass
{
公共IEnumerable _参数=新[]{“Val1”、“Val2”、“Val3”};
public void PrintField()
{
var parameters=this.GetType().GetField(“_parameters”).GetValue(this)作为IEnumerable;
//印刷品:
//瓦尔1
//瓦尔2
//Val3
foreach(参数中的变量项)
{
控制台写入线(项目);
}
}
}

如果要根据字段的字符串名称获取字段值,则必须使用反射

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);

你的问题不清楚。你能展示一些代码吗?您是如何使用switch case语句和dictionary的?动态解析是什么意思?将(u datafile)变为(u datafile)是什么意思?以下是一段代码片段以及dictionary定义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(step,tag,SearchDictionary(value));}我认为这不会按原样工作<代码>\u数据文件必须是属性。您应该能够对属性执行相同的操作。我在我的示例中添加了一个。嗯,是的,它将与
数据文件
一起使用,但与
\u数据文件
不一起使用。您应该删除
var f=typ.GetField(“\u数据文件”)
此代码在LinqPad中有效,但仅当字段是公共字段时有效,因此我同意通常您不希望以这种方式访问字段。这取决于OP试图做什么。好吧,我错了,我认为它只对属性有效,而对字段无效。但它确实如此。这是部分工作的公共静态字符串_数据文件;字符串值=rdr.GetValue(rdr.GetOrdinal(“value”)).ToString();字符串结果=this.GetType().GetField(值,BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public).GetValue(this.ToString();这适用于单变量,现在我必须让它适用于一个集合,例如:一个名为_参数的数据集合,我希望从中解析_参数等。上面的编辑是否回答了您的问题?还不完全清楚,但我认为这个问题实际上是关于反射,而不是数据库访问。。。
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);