Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将类的对象作为字符串运算符分配给变量?_C#_String_Class_Operators_Overloading - Fatal编程技术网

C# 如何将类的对象作为字符串运算符分配给变量?

C# 如何将类的对象作为字符串运算符分配给变量?,c#,string,class,operators,overloading,C#,String,Class,Operators,Overloading,我有一个具有属性的类 比如说 class Caption { public string AR{get;set;} public string EN{get;set;} pbulic string Tu{get;set;} } 例如,我想直接将标题对象分配给VARABLE,而不需要调用属性 我想用这个 Caption caption=new Caption(); string myVar = caption; // this will return EN pro

我有一个具有属性的类

比如说

class Caption
{  
   public string AR{get;set;}
   public string EN{get;set;}
   pbulic string Tu{get;set;}   
}
例如,我想直接将标题对象分配给VARABLE,而不需要调用属性

我想用这个

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

string myVar = caption.En;
我不知道,但我认为目标类本身有重载字符串运算符或其他东西

为什么我需要这个?只是为了本地化的目的和本地化对象的可读性。
而是每次创建
开关(语言)
时,分配
caption.EN
caption.AR
。这将很难看。

最干净的方法可能是实现索引器。这样,您就可以在
标题
类中一次性切换,对
语言进行任何检查
,处理问题,处理默认值等,而无需调用方法,如下所示:

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;
        }
    }
}

请注意,可以实现所需的语法,您可以将
标题
隐式转换为
字符串
。需要注意的是,在进行转换之前,您需要了解
语言

您可以通过提供一个在创建时处理它的构造函数和/或一个方法(如果您愿意,可以使用链)来实现这一点,就像我下面使用
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

您可以添加一个接受例如
CultureInfo
参数的构造函数。重写
ToString()
,以使用构造函数中指定的语言返回标题。您可以将与特定区域性中的文本对应的所有字符串存储在字典中,而不必为每个区域性使用公共属性。从JSON文件加载也更容易。您可以覆盖Caption类中的ToString()方法,但随后必须说string myVar=Caption.ToString()才能访问它。让我理解一下-索引器比GetLanguageString(string strLanguage)类中的方法有什么好处“这与索引器具有相同的方法体。@Rakesh,方便是主要的好处,但如果您愿意,当然一个方法也可以工作得很好。”。基于他们希望尽可能直接地获取值,我宁愿做
caption[lang]
而不是
caption.GetLanguageString(lang)
。明白了,我自己从来没有使用过索引器,所以我想知道是否有更多的索引。这正是我需要的。首领那就是让一个类用作字符串!这就是我需要的,谢谢。@devmuhammadkamal,很高兴它帮助了你。我更新了答案,添加了一点关于隐式转换的内容;它可能适用于您的情况,并且正是您想要的:)