有没有办法获取带有变量的属性?

时间:2019-02-12 06:06:13

标签: c#

我有一个C#程序,用户可以在配置文件中指定将Windows声音作为其例行程序的一部分进行播放。我的声音在变量“ parameter”中,并且会像“星号”,“ hand”,“ question”等。在Java中,当我制作Minecraft插件时,枚举有一个.valueOf,我可以传递字符串和如果该字符串与枚举名称之一匹配,则将其返回。我做了System.Media.SystemSounds。看看发生了什么。没有类似的功能(我想是可以预期的,因为我认为它不是枚举)。

有没有一种方法可以轻松地将我的字符串名称转换为匹配的SystemSound?我的意思是,我可以打开string.ToLower()并以这种方式进行操作,但我希望有一种班轮方式。

谢谢!

4 个答案:

答案 0 :(得分:0)

  

有一种方法可以轻松地将我的字符串名称转换为匹配的SystemSound

使用Dictionary<string, SystemSounds>,然后将所有字符串和声音插入其中。然后稍后通过字符串键查找声音。

否则,您正在寻找的术语称为反射-Get property value from string using reflection in C#

答案 1 :(得分:0)

如果您以enum开头,如下所示:

public enum Foo
{
    Bar = 42, Qaz = 99
}

然后您可以执行以下操作:

Dictionary<string, Foo> map =
    typeof(Foo)
        .GetEnumValues()
        .Cast<Foo>()
        .Zip(
            typeof(Foo)
                .GetEnumValues()
                .Cast<int>(),
            (n, v) => new { n, v })
        .ToDictionary(x => x.n.ToString(), x => (Foo)x.v);

Console.WriteLine((int)map["Bar"]);
Console.WriteLine((int)map["Qaz"]);

输出:

42
99

答案 2 :(得分:0)

您可以使用反射。

enum MyEnum {
  Asterix, Hand, Question
}

public static void Main(string[] args)
{
  var field = typeof(MyEnum).GetField("Asterix");

  var myEnum = field.GetValue(field);

}

myEnum变量基于提供给typeof(MyEnum).GetField("Asterix")方法的字符串变量,获取MyEnum.Asterix的值。

答案 3 :(得分:0)

如果您需要按名称访问类SystemSounds的静态属性 ,则可以使用反射,如下所示:

var sound = System.Media.SystemSounds.Asterisk;
Console.WriteLine(sound);
var name = "Asterisk";
var soundByName = typeof(System.Media.SystemSounds).GetProperty(name).GetValue(null, null); // null, null because it's a static property
Console.WriteLine(soundByName);
Console.WriteLine(sound == soundByName); // Should output 'true'