C# 将字符串转换为结构

C# 将字符串转换为结构,c#,enums,C#,Enums,我已将基于字符串的枚举创建为结构: public struct Version { public const string Version1 = "Version1", Version2 = "Version2"; } 我试着这样使用它: public Version curVersion { get { if (ConfigurationManager.AppSettings["Version"] ==

我已将基于字符串的枚举创建为结构:

public struct Version {
    public const string
        Version1 = "Version1",
        Version2 = "Version2";
}
我试着这样使用它:

    public Version curVersion {
        get {
            if (ConfigurationManager.AppSettings["Version"] == "Version1") {
                return Version.Version1;
            }
            return Version.Version2;
        }
    }
public struct Version
{
    private string value;
    private Version(string value)
    {
        this.value = value;
    }

    public static readonly Version Version1 = new Version("Version1");
    public static readonly Version Version2 = new Version("Version2");

    public override string ToString()
    {
        return value;
    }
}
public static class Version {
    public const string
        Version1 = "Version1",
        Version2 = "Version2";
}
但是,它在“return Version.Version1”上抛出一个错误,表示:

我如何转换


我还尝试了“(Version)return Version.Version1;”,结果是相同的,只是错误删除了“隐式”一词。如果要返回字符串,则
curVersion
应为
string
类型,而不是
Version
,在您的情况下,适当的解决方案是只使用常规枚举:

enum Version
{
    Version1,
    Version2,
}
如果要获取特定枚举的字符串值,可以使用
ToString

string s = Version.Version1.ToString();//this will result in the string "Version1"
至于您看到错误的原因,代码中的
Version.Version1
不是
Version
的实例。变量的类型为
String
。它在
Version
类中定义的事实并不使它成为
Version
的实例。您需要创建一个
新版本
,并返回该版本进行编译

虽然您可以创建自己的基于字符串的枚举类型,但根本不需要。正如我前面所说,您可以直接使用
ToString
。如果仍要执行此操作,代码可能如下所示:

    public Version curVersion {
        get {
            if (ConfigurationManager.AppSettings["Version"] == "Version1") {
                return Version.Version1;
            }
            return Version.Version2;
        }
    }
public struct Version
{
    private string value;
    private Version(string value)
    {
        this.value = value;
    }

    public static readonly Version Version1 = new Version("Version1");
    public static readonly Version Version2 = new Version("Version2");

    public override string ToString()
    {
        return value;
    }
}
public static class Version {
    public const string
        Version1 = "Version1",
        Version2 = "Version2";
}
然后,您可以进一步添加解析、比较、相等等功能,所有这些都基于底层字符串值


使用此自定义“字符串枚举”类型的主要原因是,枚举的字符串值必须与用于表示它的变量名不同。如果字符串值不是C#中的合法标识符(即其中包含空格的内容),或者可能只是因为它很长,标识符应该是它的较短版本,那么这一点尤其重要。

您的结构没有任何意义,因为它没有任何实例字段。将其更改为
静态
类,如下所示:

    public Version curVersion {
        get {
            if (ConfigurationManager.AppSettings["Version"] == "Version1") {
                return Version.Version1;
            }
            return Version.Version2;
        }
    }
public struct Version
{
    private string value;
    private Version(string value)
    {
        this.value = value;
    }

    public static readonly Version Version1 = new Version("Version1");
    public static readonly Version Version2 = new Version("Version2");

    public override string ToString()
    {
        return value;
    }
}
public static class Version {
    public const string
        Version1 = "Version1",
        Version2 = "Version2";
}
然后
Version1
Version2
具有类型
string
。也许您的属性
curVersion
也应该有类型
string


如果确实需要结构,可以将其更改为:

public struct Version {
    public readonly string Text;

    Version(string text) {
        Text = text;
    }

    public static readonly Version Version1 = new Version("Version1");
    public static readonly Version Version2 = new Version("Version2");
}

“创建为结构的基于字符串的枚举”?!您的结构没有任何字段,尽管返回“作为结构创建的基于字符串的枚举”毫无意义?!错误无法将类型“string”隐式转换为“Verion”,甚至与您的代码不匹配……在这种情况下使用枚举器没有意义。“基于字符串的枚举创建为结构”!!!!!但它不会强制要求只有这两个值才是对象的有效值。@当然可以,但如果没有正确的枚举,就不能这样做。当然可以。还有,谁说你不能使用正确的枚举?请参阅我的答案,了解这两种方法如何解决问题。这就是我目前所做的,我只是希望有一种方法可以强力键入我的字符串。。。“我猜不是。”永科比勒玉说,“肯定有办法。”。最简单的方法是只使用
枚举
。这与它们的实际用途完全相同。是的,但它们只允许整数@永科比利那没关系。您可以利用
ToString
获取表示该枚举的字符串值。而且,它不仅仅是int,它可以是任何整数类型,但这在这里并不相关。