C# 使用包含变量';姓名
我正在从数据库中读取字符串变量的名称(例如“_datafile”)。我想知道如何使用此字符串访问程序中的命名变量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;
我已经尝试过使用字典、哈希表和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);