我需要一些C#泛型澄清

时间:2015-09-15 17:20:59

标签: c# class object generics abstract

我这边有点问题。我正在使用泛型类,但我不知道从UI面板中选择之前的类型。如何在知道对象之前声明我的对象? 所以这是样本

public class UI
{
    Agent myAgent;
    public UI()
    {
    }
    public void Initialize()
    {
        if (textBox1.Text == "LabAgent")
            myAgent = new Agent<LabState, LabAction>();
        else
            myAgent = new Agent<FieldState, FieldAction>();
    }
}

Agent类是一个简单的泛型类。我怎么能做这样的事情,但实际工作?如何在不知道类型的情况下定义myAgent? 注意:我使用的是C#,而不是Java。 编辑1:

public class Agent<S,A>
    where S : AState
    where A : AAction
{
    private List<S> states;
    private List<A> actions;

    private Dictionary<KeyValuePair<S, A>, float> Q;

    private S stareCurenta;

    public void Initializare()
    {
        foreach (S s in states)
        {
            foreach (A a in actions)
            {
                Q.Add(new KeyValuePair<S, A>(s, a), 32000);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:6)

  

如何在不知道类型的情况下定义myAgent?

你做不到。 Agent<LabState, LabAction>Agent<FieldAgent, FieldAction>是完全不同的类型。如果您尝试在另一种方法中使用myAgent,那么在编译时如何知道它是Agent<LabState, LabAction>还是Agent<FieldAgent, FieldAction>,那么编译器如何绑定到任何属性或方法?

可能拥有非通用Agent基类,但它无法访问任何通用属性或方法。

答案 1 :(得分:1)

看起来你想要使用协方差。为了首先执行此操作,您需要一个Agent将实现的接口,我们称之为IAgent。然后你需要定义像

这样的界面
public interface IAgent<out TState, out TAction> 
    where TState : IState
    where TAction : IAction

然后你可以做

IAgent<IState, IAction> agent = new Agent<LabState, LabAction>

假设您的AgentLabStateLabAction分别实施IAgentIStateIAction。但是,如果它只返回那些类型的值并且从不接受它们,那么你只能将IAgent定义为共变量。因此泛型类型应该只显示为方法的返回类型和只读属性的类型。您也可以用接口IActionIState替换基类,但是协方差运算符out只能用于接口。

答案 2 :(得分:0)

你不是。

我认为你最好制作两个UI类,每个类型代理一个,都来自提供所有UI非代理功能的相同基类。