Объект Javascript в С#

Есть ли простой способ создать что-то вроде следующего JS-кода:

var players = [
    {name:"Joe",score:25,color:"red",attribs:[0,1,2,3,4]},
    {name:"Jenny",score:1,color:"black",attribs:[4,3,2,1,0]}
];

в С# (для Unity 3d)?

Я уже смотрел List, Dictionary и ArrayList, но все швы так... негибкие и сложнейшие...

Основная цель здесь - иметь что-то гибкое, которое может быть доступно из многих других мест без необходимости запоминать индексы массивов, типы переменных и т.д. Возможно, это невозможно сделать на С#... Но что-то, что есть достаточно близко должно быть достаточно. Возможно, ArrayList...?

Спасибо.

Ответ 1

Этот JavaScript, являющийся массивом объектов, напрямую переносится на С#, и у вас есть несколько способов сделать это и несколько классов классов для использования (в отличие от JavaScript, который имеет только один класс коллекции)

Его можно почти написать на С# и он абсолютно прав (с использованием анонимных типов):

var players = new [] {
    new  {name = "Joe",score = 25, color = "red", attribs = new int[]{ 0,1,2,3,4}},
    new  {name = "Jenny",score = 1, color = "black", attribs = new int[]{4,3,2,1,0}}
};

Но я не уверен, достигнет ли это того, чего вы хотите (функциональность мудрая)

ИМО, создающий типизированный объект, будет лучшим подходом (я считаю, что это лучший подход как на С#, так и на JavaScript), поэтому я бы подошел к нему более как это (JavaScript):

function Player(name,score,color,attribs)
{
    this.name = name;
    this.score = score;
    this.color = color;
    this.attribs = attribs;
}

var players = [
    new Player("Joe", 25, "red", [0, 1, 2, 3, 4]),
    new Player("Jenny",1,"black", [4, 3, 2, 1, 0])
];

и то же самое в С#:

public class Player
{
    public string name;
    public int score;
    public string color;
    public int[] attribs;
}


Player[] players = new Player[]{
         new Player(){ name = "Joe", score = 25, color = "red", attribs = new int[]{0,1,2,3,4} },
         new Player(){ name = "Jenny", score = 1, color = "black", attribs = new int[]{4,3,2,1,0} },
};

или для получения большей гибкости вы можете использовать их в списке, например:

 List<Player> players = new List<Player>(){
             new Player(){ name = "Joe", score = 25, color = "red", attribs = new int[]{0,1,2,3,4} },
             new Player(){ name = "Jenny", score = 1, color = "black", attribs = new int[]{4,3,2,1,0} },
    };

Ответ 2

Не удалось создать модель Player (класс) с параметрами Name, Score, Color, Attribs и сохранить каждый Player в памяти в List<Player>:

public class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
    public string Color { get; set; }
    public int[] Attribs { get; set; }
}

...

List<Player> myPlayers = new List<Player>();
Player joe = new Player();
joe.Name = "Joe";
joe.Score = 25;
joe.Color = "red;
joe.Attribs = new int[] { 0, 1, 2, 3, 4 };;
myPlayers.Add(joe);

Используя System.Linq, вы можете запросить List<Player> для определенных игроков. Например:

Player player = myPlayers.SingleOrDefault(p => p.Name == "Joe");

Дополнительный кредит - всегда проверяйте, не проигрывает ли плеер, прежде чем пытаться его использовать:

if (player != default(Player))
{
    // do something with joe
}

Ответ 3

Более или менее соответствие для синтаксиса было бы анонимным типом:

var players = new[]{
    new {name = "Joe", score = 25, color = "red", attribs = new[]{0,1,2,3,4}},
    new {name = "Jenny", score = 1, color = "black", attribs = new []{4,3,2,1,0}}
};

но он имеет совсем другое значение, чем JavaScript (массив неизменяемых строго типизированных объектов в С# и словарь утиного типизированного объекта в JavaScript).

Возможно, вы захотите изучить dynamic и ExpandoObject, который существует для поддержки таких языков, как JavaScript в .Net, если они присутствуют в Unity3d.

    dynamic person = new System.Dynamic.ExpandoObject();
    person.Name = "John Smith";
    person.Age = 33;

Обратите внимание, что С# - строго типизированный язык, и, возможно, лучше изменить способ мышления, чтобы он соответствовал языку. Пребывание с JavaScript является разумным вариантом, если вы не можете уйти от языков утиных языков.