(Извиняюсь за повсеместное использование C # - я полагаю, что концепции больше касаются .NET, чем языка, который вы используете; надеюсь, вы лучше читаете C #, чем я пишу на VB.)
Ненепосредственно - перечисления в .NET - это просто целочисленные типы с именами для некоторых значений.
Самое близкое, что вы можете сделать в .NET, - это создать тип с фиксированным набором значений.Например, в вашем случае:
public sealed class Country
{
public static readonly Country Ireland = new Country("Europe");
public static readonly Country France = new Country("Europe");
public static readonly Country Nigeria = new Country("Africa");
public static readonly Country Thailand = new Country("Asia");
private readonly string continent;
public string Continent { get { return continent; } }
private Country(string continent)
{
this.continent = continent;
}
}
(я предполагаю, что VB.NET будет очень похожим.)
Обратите внимание, что это не позволяет вам переключатьсядля значений перечисления.
Если вы хотите полиморфизм, вы можете создать вложенные подклассы, которые все еще могут вызывать конструктор private , который предотвращает создание любых других подклассов.
Oneальтернативой этому является использование атрибутов для обычных перечислений:
[AttributeUsageAttribute(AttributeTargets.Field)]
public class ContinentAttribute : Attribute
{
// etc
}
public enum Country
{
[Continent("Europe")] Ireland = 1,
[Continent("Europe")] France = 2,
...
}
Затем вам нужно будет использовать отражение, чтобы получить ContinentAttribute
и получить строку.
Обратите внимание, что здесь нет действительно фиксированного набора значений - вы могли бы написать:
Country country = (Country) 15;
В этот момент вы не можете получить континент для него, и еслиВы передаете это любым методам, которые ожидают, что это будет реальная страна, у вас есть проблемы.Это не относится к более раннему решению, где вы действительно ограничены этими несколькими значениями (и нулем).