2016-09-07 4 views
1

В JavaScript у меня может быть массив различных объектов в каждой ячейке, и при перечислении его каждая ячейка будет обрабатываться как объект, а не как основной общий объект коллекции.JS like enumaration in C#

Допустим, у меня есть 2 объекта:

class car 
{ 
    public color; 
    ... 
} 

class paint 
{ 
    public color; 
    ... 
} 

Есть ли синтаксис для enumaration как

car beemer; 
paint panda; 
... 
foreach (thing in [beemer, panda]) 
{ 
    thing.color = "red"; 
} 

в C#?

+0

Не могли бы вы предоставить * полный * пример кода JavaScript, который вы хотели бы имитировать на C#? –

+0

[beemer, panda] - это просто JS для массива. C# массивы? – DvS

+1

Используйте «интерфейс» для такого рода вещей. – DavidG

ответ

3

Если вы реализуете интерфейс с свойством цвета, определенным на интерфейсе, это может быть достигнуто.

public interface IHasColor 
{ 
    string color { get; set; } 
} 

public class car : IHasColor 
{ 
    public color { get; set; } 
    ... 
} 

foreach (IHasColor thing in new IHasColor[] { beemer, panda }) 
{ 
    thing.color = "red"; 
} 
+0

Эти объекты берутся из черной ячейки dll –

+0

Тогда наследование может решить это, создать свои собственные версии классов и реализовать интерфейс там – benPearce

5

Ну, вы можете использовать динамический ввод, если вы действительно хотите:

public class Paint 
{ 
    public string Color { get; set; } 
} 

public class Car 
{ 
    public string Color { get; set; } 
} 

... 

var objects = new object[] 
{ 
    new Car { Color = "Red" }, 
    new Panda { Color = "Black" } 
}; 
foreach (dynamic value in objects) 
{ 
    Console.WriteLine(value.Color); 
} 

Но было бы более обычными объявить интерфейс со свойством вы хотите, а затем сделать все соответствующие типы реализации интерфейс:

public interface IColored 
{ 
    string Color { get; set; } 
} 

public class Paint : IColored 
{ 
    public string Color { get; set; } 
} 

public class Car : IColored 
{ 
    public string Color { get; set; } 
} 

... 

var objects = new IColored[] 
{ 
    new Car { Color = "Red" }, 
    new Panda { Color = "Black" } 
}; 
foreach (IColored value in objects) 
{ 
    Console.WriteLine(value.Color); 
} 

Это:

  • Более эффективный
  • Безопаснее, как вы знаете, во время компиляции, что каждое значение, которое вы повторяете, имеет свойство Color.
+0

Если я рассматриваю ячейка в массиве объектов как динамическая, она будет обладать всеми исходными свойствами настраиваемого объекта? –

+0

@SharonJDDorot: Да - значение массива - это просто ссылка на объект ... –

+0

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