我正在制作C#2008中的地址簿。我需要能够保存联系人,然后在用户要求时显示它们。当有人在写出人喜欢的颜色时输入未知颜色时,我还需要处理异常。 到目前为止,这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab02
{
class Program
{
static void Main(string[] args)
{
Contact contact = new Contact();
Console.WriteLine("Please enter the person's name:");
contact.Name = Console.ReadLine();
Console.WriteLine("Please enter the person's e-mail address:");
contact.Email = Console.ReadLine();
Console.WriteLine("Please enter the person's favorite color:");
string tempColor = Console.ReadLine();
contact.Favoritecolor = (System.Drawing.KnownColor)(Enum.Parse(typeof(System.Drawing.KnownColor), tempColor));
try
{
}
catch
{
}
finally
{
Console.WriteLine("This is an unknown color. Please enter a known color");
}
}
class Color
{
enum clr
// This is a list of colors for the user to pick from.
{
Red,
Green,
Blue,
Yellow,
Purple,
Brown,
Black,
Crimson,
White,
Turqoise,
Orange,
Cyan,
Pink,
Gold,
Silver,
Bronze,
Gray,
Indigo,
Rust
}
}
}
class Contact
{
//This string represents the person's Name.
public string Name { get; set; }
//This string represents the person's Email.
public string Email { get; set; }
public System.Drawing.KnownColor Favoritecolor
{
get;
set;
}
}
}
有人可以帮我吗?
答案 0 :(得分:1)
为什么不列出用户可以选择的所有颜色,使用枚举值,然后让他们输入一个数字,尝试将其转换为枚举,然后存储它。如果它无法转换,请让他们知道它无效。
这里有一小段帮助。但是,你需要公开你的枚举。
Console.WriteLine("Here are a list of colors:");
foreach(Color.clr item in Enum.GetValues(typeof(Color.clr)))
{
Console.WriteLine(string.Format("{0} - {1}",(int)item,item.ToString()));
}
Console.WriteLine("Please choose your color");
string colorInput = Console.ReadLine();
int colorValue = 0;
if(!int.TryParse(colorInput, out colorValue))
{
Console.WriteLine(string.Format("{0} is not a valid number",colorInput));
return;
}
// This will give an error if they've typed a number that wasn't listed
// So need to add a bit of checking here
Color.clr tempColor = (Color.clr)colorValue;
// Your code here
答案 1 :(得分:1)
您也可以使用反射:
public static class ColorInfo
{
private static readonly PropertyInfo[] PropertiesInfo;
static ColorInfo()
{
PropertiesInfo = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static);
}
public static bool TryGetKnownColorFromString(string colorName, out KnownColor knowColor)
{
if (String.IsNullOrEmpty(colorName))//if wrong color name
{
knowColor = KnownColor.ActiveBorder;
return false;
}
try
{
foreach (PropertyInfo property in PropertiesInfo)
{
if (property.Name.Equals(colorName, StringComparison.InvariantCultureIgnoreCase))
{
knowColor = ((Color)property.GetValue(null, null)).ToKnownColor();
return true;
}
}
}
catch (Exception exc)
{
//catch GetValue & Equals methods exceptions
if (!(exc is ArgumentException || exc is TargetException ||
exc is TargetParameterCountException ||
exc is MethodAccessException ||
exc is TargetInvocationException))
{
//throw exc; //We don't want to lose information from StackTrace
throw;
}
}
knowColor = KnownColor.ActiveBorder;
return false;
}
}
简单测试:
string[] colors = { "reD", "AzUre", "Blue", "BlueViollet" };
KnownColor knowColor;
foreach (String color in colors)
{
if (ColorInfo.TryGetKnownColorFromString(color, out knowColor))
{
Console.WriteLine(knowColor.ToString());
}
else
{
Console.WriteLine("Color: {0} - not found !", color);
}
}
输出:
Red
Azure
Blue
Color: BlueViollet - not found !
有用的使用:
using System;
using System.Drawing;
using System.Reflection;
答案 2 :(得分:1)
你打算在控制台应用程序,表格应用程序中显示它们,它是否需要保留数据或只是在应用程序的生命周期内保留在内存中,是你的类“联系人”可序列化
为简单起见,由于这是家庭作业,请让您的班级联系Serializable
[Serializable]
public class Contact
{}
并使用二进制序列化,我不打算在这里全部编写,但它相当简单的查找二进制序列化和二进制格式,如果你愿意,可以为每个联系人或联系人列表写一个流到磁盘。 然后,如果这是在控制台应用程序中,请创建一个接受“列表”命令的读取行,并点击一个迭代它们的方法,并显示每个联系人的属性。
就你写作业而言,除非你付钱给我,否则我会去。
答案 3 :(得分:0)
解析被移动到try块中,catch块(捕获异常)告诉用户他们需要输入已知的东西。 finally块不是必需的,因此被删除了:
try
{
contact.Favoritecolor = (System.Drawing.KnownColor)(Enum.Parse(typeof(System.Drawing.KnownColor), tempColor));
}
catch(ArgumentException)
{
Console.WriteLine("This is an unknown color. Please enter a known color");
}
下一部分是你需要一个循环,直到输入有效颜色
bool isValidColour = false;
while (!isValidColour)
{
Console.WriteLine("Please enter the person's favorite color:");
string tempColor = Console.ReadLine();
try
{
contact.Favoritecolor = (System.Drawing.KnownColor)(Enum.Parse(typeof(System.Drawing.KnownColor), tempColor));
isValidColour = true;
}
catch(ArgumentException)
{
Console.WriteLine("This is an unknown color. Please enter a known color");
}
}
以上将继续循环,直到输入有效颜色。
我希望这会有所帮助。
答案 4 :(得分:0)
好的,这一行:
contact.Favoritecolor = (System.Drawing.KnownColor)(Enum.Parse(typeof(System.Drawing.KnownColor), tempColor));
您在哪里获取用户输入的颜色值,并将其解析为已知颜色,是否正确?
似乎你可能会遇到问题。我会看到该行可以抛出什么类型的异常,并正确处理它们。
如果有人在命令行中输入“rED”会怎样?该抛出异常吗?在你的代码示例中,它会引发异常吗?
此外,您有一个自定义颜色类,其枚举类型称为“clr”,但在您的代码中,您正在将您的枚举解析为System.Drawing.KnownColor类型。我会修改自定义类并使用内置类型。