:: Не фоксом единым
Пример со stackoverflow
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
На stackoverflow.com есть такой пример:

public class Question
{
// Attributes
protected int index;
protected string name;
// Go with a dictionary to enforce unique index
//protected static readonly ICollection<Question> values = new Collection<Question>();
protected static readonly IDictionary<int,Question> values = new Dictionary<int,Question>();
// Define the "enum" values
public static readonly Question Role = new Question(2,"Role");
public static readonly Question ProjectFunding = new Question(3, "Project Funding");
public static readonly Question TotalEmployee = new Question(4, "Total Employee");
public static readonly Question NumberOfServers = new Question(5, "Number of Servers");
public static readonly Question TopBusinessConcern = new Question(6, "Top Business Concern");
// Constructors
protected Question(int index, string name)
{
this.index = index;
this.name = name;
values.Add(index, this);
}
// Easy int conversion
public static implicit operator int(Question question) =>
question.index; //nb: if question is null this will return a null pointer exception
public static implicit operator Question(int index) =>
values.TryGetValue(index, out var question) ? question : null;
// Easy string conversion (also update ToString for the same effect)
public override string ToString() =>
this.name;
public static implicit operator string(Question question) =>
question?.ToString();
public static implicit operator Question(string name) =>
name == null ? null : values.Values.FirstOrDefault(item => name.Equals(item.name, StringComparison.CurrentCultureIgnoreCase));
// If you specifically want a Get(int x) function (though not required given the implicit converstion)
public Question Get(int foo) =>
foo; //(implicit conversion will take care of the conversion for you)
}

На сколько понимаю, теперь можно сделать так:

static void Main(string[] args)
{
string strQuestion = Question.TotalEmployee;
int intQuestion = Question.TotalEmployee;
Question question= Question.TotalEmployee;
Console.WriteLine(strQuestion);
Console.WriteLine(intQuestion);
Console.WriteLine(question.ToString());
}

Но, во всех случаях, словарь values просто не задействован, и его можно убрать из кода. Что я упускаю? Есть ещё какие то варианты использования класса Question? Как можно использовать "implicit operator Question(string name)"?
Ratings: 0 negative/0 positive
Re: Пример со stackoverflow
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Словарь задействован - в конструкторе стоит добавление вновь созданного экземпляра туда. Используется как защита от повторного добавления экземпляра с тем же "кодом".
Это всё безобразие - самодельная замена enum-а. У людей возникают вопросы, как легко и просто пользовать то число, то строку/название, то собственно enum как значение. В некотором роде это обход контроля типов - если указано что нужен Question (скажем в параметре некоторого метода) - то напрямую (без явного преобразования типов) ни число ни тем более строку с "названием" туда передать нельзя. Этот вариант - обход подобных "ограничений". Соответственно и операторы приведения типов для этого и нужны.

В примере как раз видна "избыточность" штатного enum по сравнению с "самоделкой" при попытке такого использования (IMHO оно для этого и не предназначено, но мало ли кому что нужно).

static void Main(string[] args)
{
Test("Number of Servers");
Test(5);
Test(Question.NumberOfServers);
TestEnum(Enum.Parse<QuestionEnum>("NumberOfServers"));
TestEnum((QuestionEnum)5);
TestEnum(QuestionEnum.NumberOfServers);
}
static void Test(Question question) => Console.WriteLine(question.ToString());
static void TestEnum(QuestionEnum question) => Console.WriteLine(question.ToString());
public enum QuestionEnum
{
Role = 2,
ProjectFunding,
TotalEmployee,
NumberOfServers,
TopBusinessConcern
}


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 4 (Гостей: 4)

© 2000-2024 Fox Club 
Яндекс.Метрика