无法将类型'string'隐式转换为'System.Type' [英] Cannot implicitly convert type 'string' to 'System.Type'

查看:1105
本文介绍了无法将类型'string'隐式转换为'System.Type'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用列表来存储和显示数据,从而在控制台应用程序中构建联系人管理器程序。我需要查看显示可用联系人摘要的报告,然后有一个菜单允许用户与该程序进行交互。我有一个方法来创建一个包含数据和联系对象的列表。 联系对象是除了 ContactTypes 之外的所有行为,这是类型数据类型。我一直收到错误无法在 createContact()方法中隐式转换类型字符串为System.Type 。我不知道如何解决这个问题。



任何指导都将不胜感激



 静态  void  Main( string  [] args)
{
// 声明列表

列表<联系人> contactList = new List< Contact>();

// 主要驱动程序
char menuItem;
Console.WriteLine( 联系人列表\ n);
menuItem = GetMenuItem();
while (menuItem!= ' Q'
{

ProcessMenuItem(menuItem,contactList);
menuItem = GetMenuItem();

}
Console.WriteLine( \ n谢谢你,再见< /跨度>);
Console.ReadLine();
}
// 返回'C','R','U',调用者的'D','L'或'X'
static char GetMenuItem()
{
char menuItem;
DisplayMenu();
menuItem = char .ToUpper(IOConsole.GetChar( \ n请选择一个项目:));
while (menuItem!= ' C'
&& menuItem!= ' R'&& menuItem!= ' Q'&&& menuItem!= ' U'&& menuItem!= ' D'&& menuItem!= ' S'& & menuItem!= ' L'&& menuItem!= ' F'&& menuItem!= ' P'&& menuItem!= ' T'
{
Console.WriteLine( \ nError - 无效的菜单项) ;
DisplayMenu();
menuItem = char .ToUpper(IOConsole.GetChar( \ n输入选项或M表示菜单:));
}
return menuItem;
}

静态 void DisplayMenu()
{
Console.WriteLine( C->创建联系人);
Console.WriteLine( R->删除联系人);
Console.WriteLine( U->更新联系人);
Console.WriteLine( D - >从文件加载数据);
Console.WriteLine( S->将数据保存到文件);
Console.WriteLine( L->视图按姓氏排序);
Console.WriteLine( F->视图按名字排序);
Console.WriteLine( P->按部分名称搜索查看);
Console.WriteLine( T->按联系人类型查看);
Console.WriteLine( Q->退出);
}

// 根据用户菜单路由到相应的流程例程选择
静态 void ProcessMenuItem(Char menuItem,List< Contact> contactList)
{
switch (menuItem)
{
case ' C'
createContact();
break ;
case ' R'
removeContact(contactList);
break ;
case ' U'
updateContact(contactList);
break ;
case ' D'
LoadToFile();
break ;
case ' S'
saveToFile();
break ;

case ' L'
sortByLastName(contactList);
break ;
case ' F'
sortByFirstName(contactList);
break ;
case ' P'
DisplayList(contactList);
break ;
case ' T'
sortByContactType();
break ;
case ' Q'

break ;

}
}

public static void createContact()
{
联系c1 = new 联系人() ;
Console.WriteLine( \ nGetFirstName);
c1.GetFirstName = Console.ReadLine();
Console.WriteLine( \ nGetLastName);
c1.GetLastName = Console.ReadLine();
Console.WriteLine( \ nGetEmailAddress);
c1.GetEmailAddress = Console.ReadLine();
Console.WriteLine( \ nGetPhoneNumber);
c1.GetPhoneNumber = Console.ReadLine();
Console.WriteLine( \ nContactTypes);
c1.ContactTypes = Console.ReadLine();

// 创建更多联系人...

// 在此处添加所有联系人
ContactCollection contactList = ContactCollection();
contactList.Add(c1);

// 循环列表
foreach (联系c contactList中)
{
Console.WriteLine(c.GetFirstName);
Console.WriteLine(c.GetLastName);
Console.WriteLine(c.GetEmailAddress);
Console.WriteLine(c.GetPhoneNumber);
Console.WriteLine(c.ContactTypes);

}

Console.ReadLine();

}

解决方案

 使用 System.ComponentModel; 

TypeConverter typeConverter = TypeDescriptor.GetConverter(propType);
object propValue = typeConverter.ConvertFromString(inputValue);


如果ContactType是枚举,你需要将从控制台读取的字符串值转换为相应的枚举值。



例如,如果ContactType定义如下:



  public   enum  ContactType 
{
Home,
Office
}





用户输入Home,然后你需要将Home(字符串)转换为ContactType.Home(类型/枚举)



您可以通过以下方式执行此操作:



 ContactType contactType =(ContactType)Enum.Parse(typeof(ContactType),contactTypeString); 


I am trying to build a contact managers program in a console application using a list to store and display the data. I need to view a report that displays a summary of contacts available and then have a menu to allow the user to interact with the program. I have a method to create a list with data and a contact object. contact object is all stings except for ContactTypes which is a Type data type. I keep getting the error Cannot implicitly convert type string to System.Type in createContact() method. I am not sure how to fix this.

any guidance would be appreciated

static void Main(string[] args)
        {         
            //Declare the list

            List<Contact> contactList = new List<Contact>();
                       
            //Main Driver
            char menuItem;
             Console.WriteLine("Contact List\n");
            menuItem = GetMenuItem();
            while (menuItem != 'Q')
            {

                ProcessMenuItem(menuItem, contactList);
                menuItem = GetMenuItem();

            }
            Console.WriteLine("\nThank you, goodbye");
            Console.ReadLine();
        }
        //Returns either a 'C', 'R', 'U', 'D', 'L', or 'X' to the caller
        static char GetMenuItem()
        {
            char menuItem;
            DisplayMenu();
            menuItem = char.ToUpper(IOConsole.GetChar("\nPlease pick an item: "));
            while (menuItem != 'C'
                && menuItem != 'R' && menuItem != 'Q' && menuItem != 'U' && menuItem != 'D' && menuItem != 'S' && menuItem != 'L' && menuItem != 'F' && menuItem != 'P' && menuItem != 'T')
            {
                Console.WriteLine("\nError - Invalid menu item");
                DisplayMenu();
                menuItem = char.ToUpper(IOConsole.GetChar("\nEnter option or M for menu:"));
            }
            return menuItem;
        }

        static void DisplayMenu()
        {
           Console.WriteLine("C-> Create Contacts");
           Console.WriteLine("R-> Remove Contacts");
           Console.WriteLine("U-> Update Contacts");
           Console.WriteLine("D -> Load data from file");
           Console.WriteLine("S-> Save data to file");
           Console.WriteLine("L-> View sorted by last name");
           Console.WriteLine("F-> View sorted by first name");
           Console.WriteLine("P-> View by partial name search");
           Console.WriteLine("T-> View by contact type");
           Console.WriteLine("Q-> Quit");
        }

        //Routes to the appropriate process routine based on the user menu choice
        static void ProcessMenuItem(Char menuItem, List<Contact> contactList)
        {
            switch (menuItem)
            {
                case 'C':
                    createContact();
                    break;
                case 'R':
                    removeContact(contactList);
                    break;
                case 'U':
                    updateContact(contactList);
                    break;
                case 'D':
                    LoadToFile();
                    break;
                case 'S':
                    saveToFile();
                    break;
                    
                case 'L':
                    sortByLastName(contactList);
                    break;
                case 'F':
                    sortByFirstName(contactList);
                       break;
                case 'P':
                       DisplayList(contactList);
                       break;
                case 'T':
                       sortByContactType();
                       break;
                case 'Q':
                       
                       break;

            }                   
        }

         public static void createContact()
        {
            Contact c1 = new Contact();
            Console.WriteLine("\nGetFirstName");
            c1.GetFirstName = Console.ReadLine();
            Console.WriteLine("\nGetLastName");
            c1.GetLastName = Console.ReadLine();
            Console.WriteLine("\nGetEmailAddress");
            c1.GetEmailAddress = Console.ReadLine();
            Console.WriteLine("\nGetPhoneNumber");
            c1.GetPhoneNumber = Console.ReadLine();
            Console.WriteLine("\nContactTypes");
            c1.ContactTypes = Console.ReadLine();

            //Create more contacts...

            //Add all contacts here
            ContactCollection contactList = new ContactCollection();
            contactList.Add(c1);

            //Loop through list
            foreach (Contact c in contactList)
            {
                Console.WriteLine(c.GetFirstName);
                Console.WriteLine(c.GetLastName);
                Console.WriteLine(c.GetEmailAddress);
                Console.WriteLine(c.GetPhoneNumber);
                Console.WriteLine(c.ContactTypes);
               
            }

            Console.ReadLine();

        }

解决方案

using System.ComponentModel;

TypeConverter typeConverter = TypeDescriptor.GetConverter(propType);
object propValue = typeConverter.ConvertFromString(inputValue);


If ContactType is an enum, you need to convert the string value you read from console to corresponding enum value.

For example, if ContactType is defined like:

public enum ContactType
{
Home,
Office
}



And user enters "Home", then you need co convert "Home" (string) to ContactType.Home (Type/enum)

You can do this the following way:

ContactType contactType = (ContactType) Enum.Parse(typeof(ContactType), contactTypeString);   


这篇关于无法将类型'string'隐式转换为'System.Type'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆