繁体   English   中英

C#中的Javascript对象

[英]Javascript Object in C#

有没有一种简单的方法来创建类似以下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]}
];

C# (Unity 3d)?

我已经查看了List,Dictionary和ArrayList,但是所有内容都是如此......不灵活且过于复杂......

这里的主要目标是有一些灵活的东西,可以从许多其他地方访问,而不需要记住数组索引,变量类型等。可能无法在C#中完成...但是相当接近的东西应该是足够。 ArrayList可能......?

谢谢。

这个JavaScript是一个对象数组,可以直接转移到C#,你有多种方法可以使用它和多个集合类来使用(不像只有一个集合类的JavaScript)

它几乎可以在C#中逐字编写,并且完全有效(使用匿名类型):

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

但我不确定这是否会实现你想要的(功能明智)

IMO创建一个类型化的对象是一种更好的方法(我认为这是C#和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])
];

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

或者为了获得更大的灵活性,您可以在List中使用它们,例如:

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

你可以使用NameScoreColorAttribs属性创建一个Player模型(类),并将每个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
}

或多或少匹配语法将是匿名类型:

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(C#中的不可变强类型对象数组与JavaScript中鸭类型对象的字典)非常不同。

您可能希望使用dynamicExpandoObject来支持.Net中的JavaScript等语言,如果它们存在于Unity3d中。

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

请注意,C#是强类型语言,改变思维方式以匹配语言可能更好。 如果你无法摆脱鸭子类型的语言,那么保持JavaScript是合理的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM