C# 正在将用户输入强制转换为枚举(反射)?

C# 正在将用户输入强制转换为枚举(反射)?,c#,class,reflection,enums,casting,C#,Class,Reflection,Enums,Casting,假设我有一门课: class Person { public string Name { get; set; } public HairColour hairColour { get; set; } public EyeColour eyeColour { get; set; } } 其中发色和眼色为枚举 我希望用户为每个人的属性输入一个值,如下所示: string userInput = ""; Person p = new Person(); Ty

假设我有一门课:

class Person
{
   public string Name { get; set; }
   public HairColour hairColour { get; set; }
   public EyeColour eyeColour { get; set; }
}
其中发色和眼色为枚举

我希望用户为每个人的属性输入一个值,如下所示:

string userInput = "";

Person p = new Person();

Type personType = typeof(Person);

foreach (var property in personType.GetProperties())
{
   Console.Write("Enter the person's " + property.Name + ": ")
   userInput = Console.ReadLine();
   personType.GetProperty(property.Name).SetValue(p, // PARSE PROPERTY HERE );
}

有没有一种方法可以将userInput强制转换为相应的类型,而不使用多个“if”语句?

您正在寻找的。

由于
SetValue
需要一个
对象,您不需要实际的编译时类型。只需使用
Enum.Parse
并将ot传递给
SetValue

userInput = Console.ReadLine();
personType.GetProperty(property.Name).SetValue(p, Enum.Parse(property.PropertyType, userInput));

或者更好的
Enum.TryParse
,因为您的输入也可能包含无效字符。

这是否回答了您的问题?由于
SetValue
需要一个
对象
,因此不需要实际的编译时类型。只需使用
Enum.Parse
并将ot传递给
SetValue
。我认为问题在于如何知道将哪种类型转换为“无if..else语句”?除非您为多个类构建非常通用的解决方案,否则我建议使用专用的“input”类,该类将为具有“硬编码”属性及其类型说明这不是一个很好的反射用例,如果你想保持这个方向,你至少应该总是做出一些断言,从字符串(用户输入)和类型的转换(enum、int或任何您将在
Person
类中使用的属性都是可能的,因为用户可以在输入中写入几乎任何字符串。在此处检查此方法可能会发现它们很有用,但请记住,在属性循环中,这绝不是明智的做法”我知道“我需要使用
Enum.Parse
property.PropertyType.IsEnum
是如何告诉您如何根据属性信息(字符串vs Enum vs int)确定要使用哪个“解析器”,而不是如何解析枚举,并且没有if..elsestatements@Fabio您是对的,我的问题是:如何知道何时使用Enum.Parse而不检查属性的类型是HairColour还是EyeColour@k0ntrol您不需要知道确切的类型——至少在编译时不需要知道——只需要知道它是一个
enum
您需要通过
property.PropertyType
获取的类型。