很抱歉,如果瓷砖有误导性。我想要做的是使用一个字符串来获取类中的值。我有什么:
class foo
{
public string field1 {get;set;}
public string field2 {get;set;}
}
public void run()
{
//Get all fields in class
List<string> AllRecordFields = new List<string>();
Type t = typeof(foo);
foreach (MemberInfo m in t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
AllRecordFields.Add(m.Name);
}
foo f = new foo();
foreach(var field in AllRecordFields)
{
//field is a string with the name of the real field in class
f.field = "foobar";
}
}
这是一个非常简单的例子,所以问题出在f.field = "foobar";
行
field
是一个字符串,其中包含我想要赋值的真实类字段的名称。
答案 0 :(得分:3)
使用PropertyInfo
代替MemberInfo
,然后使用SetValue
。
public void run()
{
foo f = new foo();
Type t = typeof(foo);
foreach (PropertyInfo info in t.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
info.SetValue(f, "foobar", new object[0]);
}
}
答案 1 :(得分:0)
首先,最好使用Properties而不是字段。 其次你的字段是私有的,无法从外面访问foo。您需要将它们声明为公开。
答案 2 :(得分:0)
对于您的示例,您必须使用反射来访问这些文件。但这很慢,风格也不是很好。您最好直接使用该类(使用属性设置器)或使用接口。
答案 3 :(得分:0)
将方法添加到foo类中以更改所有属性
class foo
{
public string field1 {get;set;}
public string field2 { get; set; }
public void SetValueForAllString( string value)
{
var vProperties = this.GetType().GetProperties();
foreach (var vPropertie in vProperties)
{
if (vPropertie.CanWrite
&& vPropertie.PropertyType.IsPublic
&& vPropertie.PropertyType == typeof(String))
{
vPropertie.SetValue(this, value, null);
}
}
}
}
foo f = new foo() { field1 = "field1", field2 = "field2" };
f.SetValueForAllString("foobar");
var field1Value = f.field1; //"foobar"
var field2Value = f.field2; //"foobar"