C#哈希表添加我自己创建的类

C#哈希表添加我自己创建的类,c#,hash,foreach,hashmap,hashtable,C#,Hash,Foreach,Hashmap,Hashtable,我从excel中读取数据并确定要执行的事件 事件都是我自己创建的类(登录和注销) 如果我读取的值=1,则执行login 如果我读取的值=2,则执行注销 我使用switch,但我的老板说我必须在Java中使用hashmap之类的东西 在Java中,我可以编写如下代码: 表.添加(“一”,login.class) 那么如何使用c#将类添加到哈希表中呢 如何读取值并调用哈希表中的class方法?您可以使用委托。例如,如果您有以下方法: public void Login() { // ...

我从excel中读取数据并确定要执行的事件

事件都是我自己创建的类(登录和注销)

如果我读取的值=1,则执行login

如果我读取的值=2,则执行注销

我使用switch,但我的老板说我必须在Java中使用hashmap之类的东西

在Java中,我可以编写如下代码:

表.添加(“一”,login.class)

那么如何使用c#将类添加到哈希表中呢


如何读取值并调用哈希表中的class方法?

您可以使用委托。例如,如果您有以下方法:

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

public void Logout() {
    // ...
}
你可以使用这本
字典

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

当然,您需要确保密钥存在。您可以用与调用常规方法几乎相同的方式调用委托。如果它们有参数或返回值,只需使用适当的
Action
Func

即可使用委托。例如,如果您有以下方法:

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

public void Logout() {
    // ...
}
你可以使用这本
字典

Dictionary<string, Action> actions = new Dictionary<string, Action>() {
    {"Login", Login},
    {"Logout", Logout}
};
当然,您需要确保密钥存在。您可以用与调用常规方法几乎相同的方式调用委托。如果它们有参数或返回值,只需使用适当的
Action
Func

实际上,C#编译器会将字符串上的
switch
作为哈希表来实现,因此手动操作不太可能获得任何结果

你甚至可以告诉你的老板你已经做了,你不会说谎;)

实际上,C#编译器将在字符串上作为哈希表实现
switch
,因此您不太可能通过手动操作获得任何好处


你甚至可以告诉你的老板你已经做了,你不会说谎;)

以下代码允许您在对象中实现可从字典索引调用的
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();
    }
}

以下代码允许您在对象中实现
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();
    }
}

@爱迪生:不是这样,你必须选择在课堂上调用哪种方法。但前提是相同的:
{“Login”,例如newlogin().DoWhatever}
。要么在字典中存储类的实例,要么在字典中存储类的实例——这仅在它们分别继承或实现公共类或接口时有效。@Edison:该类是否有静态方法?如果没有,则需要存储实例。如果要调用相同的方法,则应该从公共
接口
继承此类实例的所有类,例如
ICallable
或类似的类。然后你可以使用
字典
@RobertHarvey你能给我举一些代码作为例子吗?我不知道如何在这里使用接口。@Edison:请参阅我发布的答案。@Edison:不知道,您必须选择要在类中调用的方法。但前提是相同的:
{“Login”,例如newlogin().DoWhatever}
。要么在字典中存储类的实例,要么在字典中存储类的实例——这仅在它们分别继承或实现公共类或接口时有效。@Edison:该类是否有静态方法?如果没有,则需要存储实例。如果要调用相同的方法,则应该从公共
接口
继承此类实例的所有类,例如
ICallable
或类似的类。然后你可以使用
字典
@RobertHarvey你能给我举一些代码作为例子吗?我不知道如何使用这里的界面。@Edison:看我贴出的答案。哦!!谢谢你!!但是我写了一个类ActionDictionary来做你写的事情,我怎么能返回类ActionDictionary的方法呢?我只想返回操作[1]。执行();您希望从
Execute()
方法返回什么?现在它正在返回
void
。查看
界面
定义?是的,我知道,所以我正在尝试修改。我的主类读取excel并发送值(比如:“Login”)让ActionDictionary类获得我想要的Action类。(比如AD.do(“Login”);)哦!!谢谢你!!但是我写了一个类ActionDictionary来做你写的事情,我怎么能返回类ActionDictionary的方法呢?我只想返回操作[1]。执行();您希望从
Execute()
方法返回什么?现在它正在返回
void
。查看
界面
定义?是的,我知道,所以我正在尝试修改。我的主类读取excel并发送值(比如:“Login”)让ActionDictionary类获得我想要的Action类(比如AD.do(“Login”);)