【问题标题】:How to assign an object of class as string operator to variable?如何将类的对象作为字符串运算符分配给变量?
【发布时间】:2019-10-13 18:52:18
【问题描述】:

我有一个有属性的类。

举例

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

我想例如直接将 Caption 对象分配给 vairable 而无需调用属性

我想用这个

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

而不是

string myVar = caption.En;

我不知道,但我认为目标类本身有重载字符串运算符或其他东西。

为什么我需要这个?只是为了本地化的目的和本地化对象的更多可读性。 而是每次创建switch(language),然后分配caption.ENCaption.AR。会很丑的。

【问题讨论】:

  • 您可以添加一个构造函数来接受例如CultureInfo 参数。覆盖 ToString() 以返回构造函数中指定的语言的 Caption。您可以将与特定文化中的文本相对应的所有字符串存储在字典中,而不是为每种文化使用公共属性。从 JSON 文件加载也更容易。
  • 您可以覆盖 Caption 类中的 ToString() 方法,但是您必须说 string myVar = caption.ToString() 才能访问它。

标签: c# string class operators overloading


【解决方案1】:

最简洁的方法可能是实现索引器。这样你就可以switch 一次,在Caption 类中对language 进行任何检查,处理问题,处理默认值等,而无需调用方法,如下所示:

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

【讨论】:

  • 只是为了让我明白 - 索引器比说 GetLanguageString(string strLanguage) 类中的方法有什么好处,它与索引器具有相同的方法主体。
  • @Rakesh,方便是主要的好处,但当然,如果喜欢的话,一种方法会很好用。基于他们希望尽可能直接地获得价值,我宁愿做caption[lang] 而不是caption.GetLanguageString(lang)
  • 知道了,我自己从未使用过索引器,所以想知道引擎盖下是否还有更多内容。
  • 这正是我所需要的。首领!那就是将一个类用作字符串!这是我需要的,谢谢。
  • @devmuhammadkamal,很高兴它帮助了你。我更新了答案以添加一些隐式转换;它可能适用于您的情况,并且正是您正在寻找的内容:)
猜你喜欢
  • 2012-06-17
  • 2017-01-11
  • 2014-12-06
  • 2019-02-08
  • 2019-08-19
  • 2018-10-08
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多