C # Class Object JavaScript, как использовать - PullRequest
0 голосов
/ 03 апреля 2019

В C # у меня есть объект класса, определенный как:

public class Row
    {
        public string id { get; set; }
        public string full_name { get; set; }
        public string email { get; set; }
    } 

Затем я могу использовать его следующим образом:

Row row = new Row();

И затем сделать что-то подобное, чтобы установить значение:

row.id = "id123";

Как сделать какой-то тип "динамической" ссылки?Это не работает:

string col = "id";  
row[col] = "id123";

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Вы можете использовать Reflection в C # следующим образом:

var prop=row.GetType().GetProperty("id");
prop.SetValue(row,"id123");
2 голосов
/ 03 апреля 2019

Чтобы ответить на ваш точный вопрос, вы можете создать собственный индексатор:

public object this[string key]
{
    get
    {
        switch(key)
        {
             case nameof(id): return id;
             case nameof(full_name): return full_name;
             case nameof(email): return email;
             default: throw new ArgumentOutOfRangeException();
        }
    }      
    set
    {
        switch(key)
        {
             case nameof(id):
                 id = value.ToString();
                 break;
             case nameof(full_name):
                 full_name = value.ToString();
                 break;
             case nameof(email):
                 email = value.ToString();
                 break;
             default: throw new ArgumentOutOfRangeException();
        }
    }
}

public void Foo()
{
    var row = new Row();
    row["id"] = "Foo";
}

Или вы используете отражение , как ответил Цунгур:

public object this[string key]
{
    get
    {
        var prop = GetType().GetProperty(key);
        return prop.GetValue(this);
    }      
    set
    {
        var prop = GetType().GetProperty(key);
        prop.SetValue(this, value);
    }
}

ОднакоНа вашем месте я бы пересмотрел ваш текущий дизайн библиотеки.Возможно, вы хотите использовать ORM, такой как Entity Framework , который сделает все сопоставления за вас.

1 голос
/ 03 апреля 2019

C # является строго типизированным языком . Это означает, что после определения типа вы не можете динамически изменять его во время выполнения *. Вы также не можете получить доступ к свойствам объекта с помощью [], как в JavaScript. Поэтому вы не можете достичь того, что вы ищете в C #. C # способ, скорее всего, будет обращаться к свойству id напрямую через row.id = "id23";. В C # вы всегда знаете во время компиляции, какие свойства и методы доступны для объекта. Если вам нужно больше гибкости, какие свойства будут там, вы также можете использовать Dictionary, KeyValuePair или просто List.

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

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