используйте строковую переменную для обращения к структурному полю - PullRequest
0 голосов
/ 31 марта 2020

В C# У меня есть структура со многими полями, например, одно называется "ключ". Я читаю файл настроек .ini, в котором есть значения для всех полей структуры. Есть ли способ использовать имена полей в качестве строк (например, строковый массив myField ниже) для адресации полей структуры во время процесса чтения (см. Ниже)? Это позволило бы мне повторить чтение многих полей в al oop на основе строкового массива.

private struct Foo {
  public string key;
  ...
}

private Foo FooInstance;
string inStr;
string[] myFields[] = new string[10]{ ("key", "nextKey", ... );

for (int i=0;i<myFields.Length;i++) {
  GetPrivateProfileString(section,myFields[i],"",inStr,255,file);
  [convert myField[i] to the relevant Foo.key field] = inStr;
}

1 Ответ

1 голос
/ 31 марта 2020

Объедините технику отражения из этого SO ответа и имейте в виду, что struct является типом значения, поэтому вам нужно правильно обработать , передавая его обратно после его обновления.

Очень быстрое решение может выглядеть так:

struct Foo { 
    public string Key;
    public string NextKey;
}
static class FooExtensions
{
    public static void Set(this ref Foo obj, string key, string value) {
        object boxed = obj; // need to box the value type so we can use it after SetValue  
        var f = typeof(Foo).GetField(key, BindingFlags.Public|BindingFlags.Instance);
        f.SetValue(boxed, value);
        obj = (Foo) boxed;
    }

    public static string Get(this Foo obj, string key)
    {
        var f = typeof(Foo).GetField(key, BindingFlags.Public|BindingFlags.Instance);
        return (string)f.GetValue(obj);
    }
}
void Main()
{   
    var f = default(Foo);   
    f.Set("Key", "test");
    f.Set("NextKey", "test");   
    f.Get("Key").Dump();
}
...