2015-07-28 2 views
0

Я пытаюсь создать программу менеджеров контактов в консольном приложении, используя список для хранения и отображения данных. Мне нужно просмотреть отчет, в котором отображается сводка доступных контактов, а затем есть меню, позволяющее пользователю взаимодействовать с программой. У меня есть метод создания списка с данными и контактным объектом, но я продолжаю получать ошибку. Невозможно неявно преобразовать тип 'string' в 'System.Type' в мой метод createContact(). Я не уверен, как это исправить.Невозможно неявно преобразовать тип 'string' в 'System.Type'

любое руководство будет оценено

 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); 
      // error line 
      Console.WriteLine(c.ContactTypes); 

     } 

     Console.ReadLine(); 

    } 

Вот мой контактный класс

class Contact 
{ 

    //private member variables 
    private String _firstName; 
    private String _lastName; 
    private Type _contactTypes; 
    private String _phoneNumber; 
    private String _emailAddress; 




    //Public constructor that takes five arguments 
    public Contact() 
    { 
     //Call the appropriate setter (e.g. FirstName) to set the member variable value 
     /*GetFirstName = firstName; 
     GetLastName = lastName; 
     ContactTypes = contactTypes; 
     GetPhoneNumber = phoneNumber; 
     GetEmailAddress = emailAddress;*/ 

    } 


    /********************************************************************* 
    * Public accessors used to get and set private member variable values 
    *********************************************************************/ 
    //Public ContactTypes accessor 
    public Type ContactTypes 
    { 
     get 
     { 
      //Return member variable value 
      return _contactTypes; 
     } 
     set 
     { 
       //Validate value and throw exception if necessary 
      if (value == null) 
       throw new Exception("ContactType must have a value"); 
      else 
       //Otherwise set member variable value*/ 
       _contactTypes = value; 
     } 
    } 
    enum ContactTypesEnum { Family, Friend, Professional } 
    //Public FirstName accessor: Pascal casing 
    public String GetFirstName 
    { 
     get 
     { 
      //Return member variable value 
      return _firstName; 
     } 
     set 
     { 
      //Validate value and throw exception if necessary 
      if (value == "") 
       throw new Exception("First name must have a value"); 
      else 
       //Otherwise set member variable value 
       _firstName = value; 
     } 
    } 

    //Public LastName accessor: Pascal casing 
    public String GetLastName 
    { 
     get 
     { 
      //Return member variable value 
      return _lastName; 
     } 
     set 
     { 
      //Validate value and throw exception if necessary 
      if (value == "") 
       throw new Exception("Last name must have a value"); 
      else 
       //Otherwise set member variable value 
       _lastName = value; 
     } 
    } 



    //Public PhoneNumber accessor 
    public String GetPhoneNumber 
    { 
     get 
     { 
      //Return member variable value 
      return _phoneNumber; 
     } 
     set 
     { 
      bool isValid = Regex.IsMatch(value, @"/d{3}-/d{3}-/d{4}"); 
      //Validate value and throw exception if necessary 
      if (value == "") 
       throw new Exception("PhoneNumber must have a value"); 
      else 
       //Otherwise set member variable value 
       _phoneNumber = value; 
     } 
    } 



    //Public Email accessor 
    public String GetEmailAddress 
    { 
     get 
     { 
      //Return member variable value 
      return _emailAddress; 
     } 
     set 
     { 
      //Validate value and throw exception if necessary 
      if (value == "") 
       throw new Exception("EmailAddress must have a value"); 
      else 
       //Otherwise set member variable value 
       _emailAddress = value; 
     } 
    } 

} 
+2

Что ваш класс 'Contact' выглядит как? Вы пытаетесь назначить 'string' (это то, что' Console.ReadLine() 'возвращает) ко всем его свойствам. Все ли они «string»? –

+1

Вы не разместили код, который имеет эту проблему, вы должны хотя бы разместить класс «Контакт». Также укажите, где происходит ошибка. –

ответ

3

Console.ReadLine() просто возвращает строку. Если вы хотите создать любой объект, то есть: ContactTypes, вы должны создать его экземпляр, используя эту строку.

ContactTypes должно быть перечислением, а не типом.

public Type ContactTypes должно быть public ContactTypes ContactTypes.

enum ContactTypesEnum { Family, Friend, Professional } должен быть enum ContactTypes { Family, Friend, Professional }

Вы должны сделать что-то, как показано ниже. Последний параметр - ignoreCare, который я установил в true.

c1.ContactTypes = (ContactTypes) Enum.Parse(typeof(ContactTypes), Console.ReadLine(), true); 
+0

ContactTypes НЕ является перечислением, это тип ... Но это должно было быть ... – thomas

+0

@thomas: Спасибо Томас, отредактировал мой ответ. – CharithJ

4

Убедитесь, что свойства контакта класса (GetFirstName, GetLastName и т.д.) являются строками, или конвертировать() Console.ReadLine() входное значение требуемого типа.

0

Console.ReadLine() возвращает строку. Что вы хотите - это тип, который возвращается из Readline().

c1.ContactTypes = Console.ReadLine().GetType(); 

Но это не делает никакого смысла, потому что Console.ReadLine всегда будет "Sytem.String". Возможно, вам придется преобразовать возвращаемое значение (строку) в объект, который вы предпочитаете.

var currString = Console.ReadLine().GetType(); 
object currObject = currString; 
if(//Check if numeric for ex.) 
{ 
    currObject = Convert.ToInt32(currString);  
} 
//Do some more validation 
//Now getType() 
c1.ContactTypes = Console.ReadLine(); 

Также см CharithJ и Chandrashekar Jupalli ответ

1

Я думаю, что вы пропустите типизированных Контактной класс

Возможно

public Type ContactTypes 

должно быть, как это вместо:

public ContactTypesEnum Type 

И

private Type _contactTypes; 

так:

private ContactTypesEnum _contactTypes; 
Смежные вопросы