c#使用string作为类字段名

本文关键字:字段 使用 string | 更新日期: 2023-09-27 18:14:59

对不起,如果标题误导。我想做的是使用字符串从类中获取值。我有的:

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是一个字符串,具有我想要分配值的真实类字段的名称。

c#使用string作为类字段名

先用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]);
  }
}

首先,最好使用属性而不是字段。其次,您的字段是私有的,不能从外部访问foo。您需要将它们声明为public

对于您的示例,您必须使用反射来访问这些文件。但这是缓慢的,不是很好的风格。你最好直接使用这个类(带属性setter)或者使用一个接口。

在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"