Как назначить объект класса как строковый оператор переменной? - PullRequest
2 голосов
/ 13 октября 2019

У меня есть класс, у которого есть свойства.

Например

class Caption
{  
   public string AR{get;set;}
   public string EN{get;set;}
   pbulic string Tu{get;set;}   
}

Я хочу, например, назначить объект Caption напрямую доступным без необходимости вызывать свойство

Я хочуиспользуйте Это

Caption caption=new Caption();
string myVar = caption;   // this will return EN property directly

Вместо

string myVar = caption.En;

Я не знаю, но я думаю, что есть оператор строки перегрузки или что-то для целевого класса.

Зачем мне нужноэто ? только для целей локализации и большей читаемости в объекте локализации. скорее каждый раз создавая switch(language), затем присваивайте caption.EN, Caption.AR. это будет некрасиво.

1 Ответ

2 голосов
/ 13 октября 2019

Самый простой способ - реализовать индексатор. Таким образом, вы можете 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
...