2012-04-18 5 views
1

Я прочитал данные из excel и определю, какое событие я собираюсь выполнить.C# hashtable Добавить мой собственный созданный класс

событие оба класса, созданный мной (логин и выход из системы)

, если значение, которое я прочитал = 1, выполнить Логин

, если значение, которое я прочитал = 2, выполнить ВЫХОД ИЗ СИСТЕМЫ

я использую но мой босс говорит, что я должен использовать что-то вроде hashmap в Java.

В Java, я могу написать код, как:

table.Add ("один", login.class);

так как я могу добавить класс в хэш-таблицу с помощью C#?

и как я могу прочитать значение и вызвать метод класса в хэш-таблице?

ответ

0

Следующего кода позволяет реализовать метод DoSomething в ваших объектах, вызываемый из словаря индекса:

public interface ICallable 
{ 
    void Execute(); 
} 

public class Login : ICallable 
{ 
    // Implement ICallable.Execute method 
    public void Execute() 
    { 
     // Do something related to Login. 
    } 
} 

public class Logout : ICallable 
{ 
    // Implement ICallable.Execute method 
    public void Execute() 
    { 
     // Do something related to Logout 
    } 
} 

public class AD 
{ 
    Dictionary<string, ICallable> Actions = new Dictionary<int, ICallable> 
    { 
     { "Login", new Login() } 
     { "Logout", new Logout() } 
    } 

    public void Do(string command) 
    { 
     Actions[command].Execute(); 
    } 
} 

Пример

AD.Do("Login"); // Calls `Execute()` method in `Login` instance. 
+0

ой! Спасибо!! НО Я пишу класс ActionDictionary, чтобы сделать то, что вы пишете, Как я могу вернуть метод класса ActionDictionary? Я просто хочу вернуть Actions [1] .Execute(); – Edison

+0

Что вы хотите вернуть из метода 'Execute()'? Сейчас он возвращает 'void'. См. Определение 'interface'? –

+0

Да, я знаю, поэтому я пытаюсь изменить. Мой основной класс прочитал excel и отправил значение (например: «Login»), чтобы класс ActionDictionary получил класс Action, который я хочу. (Как AD.do («Login»);) – Edison

5

Вы можете использовать делегатов. Например, если у вас эти методы:

public void Login() { 
    // ... 
} 

public void Logout() { 
    // ... 
} 

Вы могли бы использовать этот Dictionary:

Dictionary<string, Action> actions = new Dictionary<string, Action>() { 
    {"Login", Login}, 
    {"Logout", Logout} 
}; 

Тогда называют это нравится:

actions[myAction](); 

Конечно, вы хотите сделать убедитесь, что ключ существует. Вы можете вызвать делегатов почти так же, как вы называете обычный метод. Если у них есть аргументы или возвращаемые значения, просто используйте соответствующие Action<T1, T2...> или Func<T1, T2... TOut>.

+0

ой, спасибо! но можно ли назвать класс не методом? – Edison

+0

@Edison: Не совсем, вам нужно выбрать, какой метод вы хотите вызвать в классе. Но предпосылка одно и то же: '{" Login ", новый Login(). DoWhatever}' например. Либо это, либо хранить экземпляр класса в словаре - это работает только в том случае, если они наследуют или реализуют общий класс или интерфейс соответственно. – Ryan

+0

@Edison: Будет ли у класса статические методы? Если нет, вам нужно будет хранить экземпляры. Вы должны наследовать все классы таких экземпляров из общего «интерфейса», например, «ICallable» или что-то подобное, если вы намереваетесь вызвать тот же метод. Затем вы можете использовать словарь ' –

1

На самом деле, компилятор C# реализует switch на строках как хэш-таблицу, поэтому маловероятно, что вы можете получить что-либо, сделав это вручную.

См. this post.

Можно даже сказать вашему боссу вы уже сделали это, и вы не лгали бы;)

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