为什么会收到“ InvalidCastException:指定的强制转换无效”。尝试将Type转换为接口时

时间:2019-07-19 22:56:11

标签: c# interface casting

我有一个带有IDialogueAnimation接口的公共类打字机。在类DialoguePrinter中的方法中,我使用接口IDialogueAnimation获取了所有对象。它们作为类型出现,我想将它们转换为IDialogueAnimation。但是,它不允许我这样做,并且我收到“ InvalidCastException:指定的强制转换无效”。错误。为什么是这样?谢谢!

我检查了Typewriter和IDialogueAnimation是否在同一程序集中(这是我尝试搜索解决方案时遇到的问题)。

IDialogueAnimation GetAnimationInterfaceFormName(string name)
{
    Type parentType = typeof(IDialogueAnimation);
    Assembly assembly = Assembly.GetExecutingAssembly();
    Type[] types = assembly.GetTypes();
    IEnumerable<Type> imp = types.Where(t => t.GetInterfaces().Contains(parentType));

    foreach (var item in imp)
    {
        if (item.Name.ToLower() == name.ToLower())
        {
            return (IDialogueAnimation) item;
        }
    }

    Debug.LogError("Can't find any animation with name " + name);
    return null;
}

这是界面

public interface IDialogueAnimation
{

    bool IsPlaying { get; set; }

    IEnumerator Run(OrderedDictionary wordGroup, float speed);

}

1 个答案:

答案 0 :(得分:4)

您的boolean keepPressingO = false; public ViewPotion() { addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent event) { if (event.getKeyCode() == KeyEvent.VK_F4) { System.out.println("Iniciando AutoPotion"); keepPressingO = true; new Thread() { @Override public void run() { try { while (keepPressingO) { Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_O); } } catch (AWTException e) { e.printStackTrace(); } } }.start(); } if (event.getKeyCode() == KeyEvent.VK_F2) { System.out.println("Parando AutoPotion"); keepPressingO = false; } } }); } 变量的类型为Type。您无法将item强制转换为您的界面,因为类Type无法实现您的界面。

您只能将实现您的接口的类型的实例强制转换为接口,而不是Type本身。

如果您想返回该类型的新实例,可以使用Activator.CreateInstance()来做到这一点:

Type

如果类型的构造函数需要参数,则还需要pass the parameters for the constructor。像这样:

if (item.Name.ToLower() == name.ToLower()) {
    return (IDialogueAnimation) Activator.CreateInstance(item);
}