0

我正在尝试做这样的事情,但我不知道怎么做,我有点迷路了

    foreach ( var type in cmdTypes )
    {
        if ( type.Name.ToLowerInvariant() == Name.ToLowerInvariant() )
        {
            return (Commands)type.execute(cmdParams);//<==Incorrect

        }
        else
        {
            //Command not found!
            return 1;
        }
    }

这个类是派生的Commands。这是基类:

abstract class Commands
{
    internal abstract int execute(object[] myParameters );

    internal string Name;

    public Commands()
    {
        Name=this.GetType().Name;
    }
}

我希望能够为execute()派生自我Commands 如何完成此操作的所有类调用

更新:我认为如果我解释我想要存档的内容会更好。当我将类名作为参数传递时,我试图让一个类调用一个方法。

4

3 回答 3

3

我认为你可能有一些一般的设计问题,但你的编译错误是由于缺少括号。

return ((Commands)type).execute(cmdParams);

点比投射更高的存在(发生在之前)。

使用完整的报价,您的报价如下所示:

return (Commands)(type.execute(cmdParams));

失败,因为它无法找到execute它所知道的type

另请注意,您可能想了解查看类型名称的原因,as并且is更安全且更易于实现。

var command = type as Commands;
if (command != null)
{
    return command.execute(cmdParams);
}
else
{
    //Command not found!
    return 1;
}
于 2013-08-19T22:05:03.323 回答
2

在尝试调用之前,您只需要先进行投射execute

return ((Commands)type).execute(cmdParams);

您编写它的方式是尝试调用execute未转换的类型,然后将结果转换为Commands.

于 2013-08-19T22:05:26.497 回答
2

看起来你有一个类型的集合,你试图将它们用作实例。您需要一个类型的实例来调用非静态方法,这可以通过强制转换或反射来完成。

如果要从该类型创建实例,请使用Activator.CreateInstance

foreach ( var type in cmdTypes )
{
    if ( type.Name.ToLowerInvariant() == Name.ToLowerInvariant() )
    {
        Command cmd = Activator.CreateInstance(type) as Command;
        if(cmd != null)  // cmd is a Command!
            return cmd.execute(cmdParams);
        else
            // what should you do?
    }
    else
    {
        //Command not found!
        return 1;
    }
}
于 2013-08-19T22:17:17.393 回答