Самый простой способ - реализовать индексатор. Таким образом, вы можете switch
один раз, делать любые проверки language
, обрабатывать проблемы, работать со значениями по умолчанию и т. Д. Внутри класса Caption
без церемонии вызова метода, например:
class Caption
{
public string AR { get; set; }
public string EN { get; set; }
public string Tu { get; set; }
// var cap = new Caption()[language];
public string this[string language]
{
get
{
var which = AR;
switch(language)
{
case nameof(EN):
which = EN;
break;
case nameof(Tu):
which = Tu;
break;
}
return which;
}
}
}
Обратите внимание, что вы можете добиться синтаксиса, который вам нужен, где вы можете неявно преобразовать Caption
в string
. Предостережение в том, что вам нужно знать language
в какой-то момент, прежде чем вы начнете преобразование.
Вы можете сделать это, предоставив конструктор, который обрабатывает его при создании, и / или метод (с возможностью цепочки, если хотите), как я делаю ниже с For
:
class Caption
{
public string AR { get; set; }
public string EN { get; set; }
public string Tu { get; set; }
// Gets the caption of the current language
public string Current { get; private set; }
// If the language is known in advance, you can return
// the desired language directly.
public static implicit operator string(Caption caption)
=> caption.Current;
public Caption For(string language)
{
var which = AR;
switch (language)
{
case nameof(EN):
which = EN;
break;
case nameof(Tu):
which = Tu;
break;
}
Current = which;
return this;
}
}
// Usage
var cap = new Caption
{
AR = "Test-ar",
EN = "Test-en",
Tu = "Test-tu"
}.For("EN");
string s = cap;
Console.WriteLine(s); // Test-en