2014-11-03 2 views
-3

Я создал класс I по имени Кассиры (показано ниже). Я могу создавать новые экземпляры с помощью кода без проблем. То, что я не могу сделать, - , вводит значение строки в строковую переменную I по имени CashierLOgInNName. Таким образом, если пользователь вводит значение, как DSPR я хочу, чтобы иметь возможность создать новый объект кассира с таким именем, или эквивалентпреобразование введенной пользователем строки в новый объект

Cashiers DSPR = new Cashiers(); 

Я включил части моего кода, которые имеют отношение к этому вопросу. В идеале, если бы у меня была строка или строки кода, которые позволили бы мне иметь эту работу и почему это было отлично.

public class Cashiers 
{ 
    public int CashierID; 
    public int Password; 
    public string FirstName; 
    public string LastName; 

    public void SetCashiers(int CashierID, int Password,string FirstName, string LastName) 
    { 
     this.CashierID = CashierID; 
     this.Password = Password; 
     this.FirstName = FirstName; 
     this.LastName = LastName; 
    } 

    public void SetNewCashier(int CashierID, int Password, string FirstName, string LastName) 
    { 
     //Cashiers NewCashier = new Cashiers(); 
     this.CashierID = CashierID; 
     this.Password = Password; 
     this.FirstName = FirstName; 
     this.LastName = LastName; 
    } 
} 

Console.WriteLine("enter New Log in name"); 
string CashierLOgInNName = Console.ReadLine(); 
+0

[Activator.CreateInstance Method] (http://msdn.microsoft.com/en-us/library/system.activator.createinstance%28v=vs.110%29.aspx) –

+0

Как работает метод Activator.CreateInstance ? – DANS80

+2

... но зачем вам это делать? Не похоже, что вы задаете имя своего кассира, вы задаете имя _variable_. Это ужасная идея и в лучшем случае невозможно поддерживать. –

ответ

0

Для более непосредственно отвечать вашим примером, опираясь на лучший метод с использованием словаря (ака Key Value Pair):

Dictionary<String,Cashiers) dictCashiers = new Dictionary<String,Cashiers>(); 
Console.WriteLine("Enter new login name:"); 
String CashierLogInName = Console.ReadLine(); 
Cashiers newCashier = new Cashiers(); 

dictCashiers.Add(CashierLogInName,newCashier); 
//replace constants in the next line with actual user's data, probably input from more ReadLine queries to user? 
dictCashiers[CashierLogInName].SetNewCashier(1,2,"Jane","Doe"); 

Вы можете увидеть dictCashiers [CashierLogInName] выполняет то, что я считаю, что вы ищет и извлекает объект Кассиров, связанный с этим идентификатором входа.

+0

Да, именно это я и искал. и да, вы уже догадались, у меня есть больше инструкций readline, которые собирают остальную часть данных. Спасибо за помощь. – DANS80

+0

Добро пожаловать @ DANS80. Кроме того, вместо использования «SetNewCashier» я бы предложил переместить это в конструктор объектов, поэтому вместо вызова 'dictCashiers [LoginName] .SetNewCashier' вы можете сконденсировать 3 строки на один:' dictCashiers.Add (CashierLogInName, новые кассиры (1,2, «Джейн,« Доу »)); – Forgen

0

Это звучит для меня как то, что вы действительно ищете либо база данных (которая является слишком широким, чтобы ответить здесь) или словарь.

В словаре, вы будете иметь возможность хранить ваши Cashier объекты в привязке по string. Разумеется, вы не влияете на имя переменной, но вы все равно можете использовать это имя в теоретическом контексте, чтобы получить то, что ищете. Если вы действительно изменили имя, это привело бы к необходимости отражения, которое было бы грязным и медленным.

private Dictionary<string, Cashiers> dict = new Dictionary<string, Cashiers>(); 

private void Save(string name, [probably some other details?]) 
{ 
    dict[name] = new Cashiers(); // or whatever 
} 

private void Print(string name) 
{ 
    Console.WriteLine(dict[name]); 
} 

private void PrintAll() 
{ 
    Console.WriteLine(string.Join(Environment.NewLine, dict.Select(c => c.Key + "\t" + c.Value.ToString())); 
} 

Очевидно, что моя реализация оставляет желать лучшего, но показывает, как вы можете ее использовать.

Смежные вопросы