我有一个带有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);
}
答案 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);
}