2014-10-22 16 views
11

Czy istnieje prosty sposób, aby stworzyć coś podobnego do następującego kodu JS:JavaScript Object w C#

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]} 
]; 

w C# (dla Unity 3d)?

Już spojrzał na listy, słownik i ArrayList, ale wszystko szew tak ... sztywne i nadmiernie skomplikowane ...

Głównym celem jest tu coś elastycznego, który może być dostęp z wielu innych lokuje się bez potrzeby zapamiętywania indeksów tablicowych, typów zmiennych itp. Prawdopodobnie nie da się tego zrobić w języku C# ... Ale coś, co jest dość blisko powinno wystarczyć. ArrayList może ...?

Dziękuję.

+0

Spójrz na parsery JSON, ja osobiście bardzo lubię JsonFX. – Kroltan

+0

spójrz na to http://stackoverflow.com/questions/1056121/how-to-create-json-string-in-c-sharp – blackmind

+0

C# jest bezpiecznym językiem typu, nie nazwałbym tego nieelastycznym ani skomplikowanym, tylko inny język –

Odpowiedz

12

Ten JavaScript jest tablicą obiektów jest bezpośrednio przeniesione do C# i masz wiele sposobów, aby to zrobić i wiele klas kolekcję do korzystać (w przeciwieństwie do JavaScriptu, który ma tylko jednej klasy kolekcja)

to może być niemal napisane dosłownie w C# i jest całkowicie poprawny (Używanie typów anonimowych):

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}} 
}; 

Ale nie jestem pewien, czy to się dzieje osiągnąć to, czego pragniesz (Funkcjonalność wi e)

IMO tworzenia wpisane obiektu byłoby lepsze podejście (uważam, że jest to lepsze podejście zarówno w języku C# i JavaScript), więc chciałbym go zbliżyć więcej tak (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]) 
]; 

i to samo w C#:

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} }, 
}; 

lub uzyskać dużo większą elastyczność można wykorzystać je w formie listy jak:

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} }, 
    }; 
+0

To wygląda fantastycznie. Jedynym problemem jest to, że muszę uczynić go "globalnym", ale Unity zgłasza "błąd CS0825: kontekstowe słowo kluczowe" var "może pojawić się tylko w deklaracji zmiennej lokalnej". – user3789335

+0

var działa tylko w zakresie metod, a globale są złe. Nie znając swojego kodu, nie miałbyś czegoś takiego jak obiekt Game z kolekcją graczy? lub coś podobnego. Jeśli musisz mieć kolekcję graczy na poziomie globalnym, nie będziesz w stanie używać niejawnego pisania (tzn. Nie możesz użyć 'var', będziesz musiał użyć typu, spróbuj wpisać opcje oznaczające' Player [] ') – OJay

+0

ty w poniedziałek. Ta lista była dokładnie tym, czego potrzebowałem. :RE – user3789335

3

można zrobić Player modelu (klasa) z Name, Score, Color, Attribs właściwości i przechowywać każdy Player w pamięci w 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); 

Korzystanie System.Linq można kwerendy List<Player> dla poszczególnych graczy np:

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

Extra kredyt - zawsze sprawdzić, że gracz nie jest domyślnie przed próbą użycia:

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

Mniej lub bardziej pasuje do składni byłoby anonimowe typy:

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}} 
}; 

ale mają zupełnie inne znaczenie niż JavaScript (tablicy niezmiennych silnie typami obiektów w C# vs. słownika kaczka wpisany obiektu w JavaScript).

Być może zechcesz sprawdzić, czy używasz dynamic i ExpandoObject, które są obsługiwane w językach takich jak JavaScript w .Net, jeśli są obecne w Unity3d.

Należy pamiętać, że język C# jest językiem ściśle pisanym i może lepiej zmienić sposób myślenia, aby pasował do języka. Pozostanie przy JavaScript jest rozsądną opcją, jeśli nie możesz uciec od języków pisanych kaczkami.

Powiązane problemy