如何在通讯录中保存联系人并列出它们?

时间:2009-07-21 22:42:23

标签: c# exception exception-handling

我正在制作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;
            }
        }
    }

有人可以帮我吗?

5 个答案:

答案 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类型。我会修改自定义类并使用内置类型。