Можете ли вы получить значение в структуре через внешнюю переменную в C #? - PullRequest
0 голосов
/ 03 ноября 2019

Итак, я в некотором роде привык к структурированию таких вещей, как JavaScript, и в свете этого я борюсь в некоторых областях в C #. Прямо сейчас я пытаюсь использовать структуры таким образом, чтобы я мог вызвать значение, используя переменную, которая бы соответствовала значению, для которого я иду.

Например, моя структура будет такой:

public struct test
{
    public int[] valuesOne;
    public int[] valuesTwo;

    public test(int[] data) 
    {
        valuesOne = new int[2] { data[0], data[1] };
        valuesTwo = new int[2] { data[2], data[3] };
    }
}

Хорошо, скажем, у меня есть все это, и я хочу получить test.valuesOne[0], но из такой переменной:

string getValue = "valuesOne";
Console.Log(test[getValue][0]);

Я знаю, что это приводит к ошибке индексации, но я нахожусь вСитуация, когда я как бы хочу эту функциональность. Конечно, я могу передать свою структуру с помощью простого метода, но если бы я мог сделать это аналогично этому без огромных проблем, я бы хотел.

Ответы [ 3 ]

1 голос
/ 03 ноября 2019

вы можете использовать dynamic + reflection + this[string key], чтобы сделать это. но для этого нужен дополнительный код.

примечание: это плохая идея, она потеряет преимущество строгой проверки типов.

demo:

void Main()
{
    var test = new test(new[] {1,2,3,4,5});
    Console.WriteLine(   test["valuesOne"][0]   ); //1
    Console.WriteLine(   test["valuesTwo"][1]   ); //4
}

public struct test 
{
    public int[] valuesOne;
    public int[] valuesTwo;

    public test(int[] data)
    {
        valuesOne = new int[2] { data[0], data[1] };
        valuesTwo = new int[2] { data[2], data[3] };
    }

    public dynamic this[string key]
    {
        get
        {
            return this.GetFieldValue(key);
        }
    }
}

public static class Extension
{
    public static object GetFieldValue(this object t, string fieldName)
    {
        var type = t.GetType();
        var fields = type.GetFields();
        var field = fields.Single(pi => pi.Name == fieldName);
        return field.GetValue(t);
    }
}

интерактивная демонстрационная ссылка: можно ли получить значение в структуре через внешнюю переменную в c |.NET Fiddle

1 голос
/ 03 ноября 2019

c # и JavaScript - две разные пары обуви. Я пытаюсь сделать что-то похожее на ваш код, но не уверен, что это то, что вы ищете.

class Program
{
    static void Main(string[] args)
    {
        var t = new Test(new int[] { 1, 2, 3, 4 });
        var value = t["valueOne"][0];
        Console.WriteLine(value);

    }
}

public class Test
{
    private Dictionary<string, int[]> _data = new Dictionary<string, int[]>();

    public Test(int[] data)
    {
        _data.Add("valueOne", new int[] { data[0], data[1]});
        _data.Add("valueTwo", new int[] { data[2], data[3]});
    }

    public int[] this [string value]
    {
        get { return _data[value]; }
    }

}
0 голосов
/ 03 ноября 2019

Обычно я бы также рекомендовал использовать Dictionary, как в @ gsharp's answer . Но поскольку это не вариант для вас, возможно, вы могли бы вместо этого использовать Dictionary делегатов:

var accessor = new Dictionary<string, Func<test, int[]>>
{
    { nameof(test.valuesOne), x => x.valuesOne },
    { nameof(test.valuesTwo), x => x.valuesTwo }
};

Теперь вы можете получить доступ к своим данным следующим образом:

string getValue = "valuesOne";
Console.Log(accessor[getValue](test_instance)[0]);

Вы можете расширить эту концепцию, обернув Dictionary в метод расширения :

public static class Extensions
{
    private static new Dictionary<string, Func<test, int[]>> accessor =
        new Dictionary<string, Func<test, int[]>>
        {
            { nameof(test.valuesOne), x => x.valuesOne },
            { nameof(test.valuesTwo), x => x.valuesTwo }
        };

    public static int[] Property(this test t, string name)
    {
        return accessor[name](t);
    }
}

Затем вы можете написать:

Console.Log(test_instance.Property(getValue)[0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...