C # использовать строку в качестве имени поля класса - PullRequest
1 голос
/ 18 ноября 2011

Извините, если плитка вводит в заблуждение. Что я хотел бы сделать, это использовать строку, чтобы получить значения из класса. Что у меня есть:

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 - это строка с именем поля реального класса, которому я хочу присвоить значение.

Ответы [ 4 ]

3 голосов
/ 18 ноября 2011

Используйте 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]);
  }
}
0 голосов
/ 18 ноября 2011

Добавить метод в класс 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"
0 голосов
/ 18 ноября 2011

Для вашего примера вы должны использовать отражение для доступа к этим файлам.Но это медленно и не очень хороший стиль.Вам лучше использовать класс напрямую (с установщиком свойств) или использовать интерфейс.

0 голосов
/ 18 ноября 2011

Прежде всего, лучше использовать Свойства вместо полей. Во-вторых, ваши поля являются закрытыми, доступ к ним невозможен со стороны foo. Вы должны объявить их как общедоступные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...