为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我收到“InvalidCastException:指定的转换无效。” 当尝试将类型转换为接口时

为什么我收到“InvalidCastException:指定的转换无效。” 当尝试将类型转换为接口时

C#
青春有我 2023-07-09 14:57:58
我有一个带有接口 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 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

你的item变量是类型Type。您无法将 a 强制转换Type为您的接口,因为该类Type没有实现您的接口。

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

如果您想返回该类型的新实例,可以使用Activator.CreateInstance()以下方法:

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

如果类型的构造函数需要参数,那么您还需要为构造函数传递参数。就像是:

return (IDialogueAnimation) Activator.CreateInstance(item, something, something);


查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信