编辑:该代码作为自定义检查器代码统一运行,但是我不确定是否相关,如果有关系,我将发布整个类。
我想获取所有实现特定接口的类,并显示一个选项列表,以便用户可以选择如何实现该接口。
这是描述角色行为的简单界面。
我试图用抽象类替换接口,但无济于事...
在调试中,我看到返回的值为空。
我在网上找到的所有内容都说该类型可能不存在,但在我的情况下是不可能的,因为我是通过反射来获得该类型的。
ICombatBehaviour combat;
private string[] FindAllCombatOptions(out List<Type> existingTypes)
{
List<string> options = new List<string>();
existingTypes = new List<Type>();
var combatBehaviours = Assembly.GetAssembly(typeof(ICombatBehaviour)).GetTypes()
.Where(myType => myType.IsClass && !myType.IsAbstract && typeof(ICombatBehaviour).IsAssignableFrom(myType));
foreach (var behaviour in combatBehaviours)
{
existingTypes.Add(behaviour);
options.Add(behaviour.Name);
}
return options.ToArray();
}
private void UpdateType(List<Type> types)
{
combat = Activator.CreateInstance(types[index]) as ICombatBehaviour;
}
UpdateType()
方法将获取FindAllCombatOptions()
方法已找到的所有类型,并在所选索引中使用该类型。类型正确,但是combat
变量保持为空...
ICombat行为:
public interface ICombatBehaviour
{
}
实施类:
public class FightBehaviour : ICombatBehaviour
{
}
public class EscapeBehaviour : ICombatBehaviour
{
}
这是调用函数:
public override void SelectType()
{
List<Type> types;
string[] options = FindAllCombatOptions(out types);
index = AskUserForAType(options); // Currently returns only zero
UpdateType(types);
}
答案 0 :(得分:0)
请在更新类型的方法创建类型之前加载所有组件。
private void UpdateType(List<Type> types)
{
for(int index =0; index < types.Count; index++)
{
Assembly.Load(types[index].Assembly.FullName);
combat = Activator.CreateInstance(types[index]) as ICombatBehaviour;
}
}
希望这会有所帮助。
答案 1 :(得分:0)
解决方案非常简单。问题不在代码中,而在Unity3D中。
Unity将类FightBehaviour
和EscapeBehaviour
创建为无法实例化的MonoBehaviour类。因此,我需要将其设置为普通班级。
感谢所有对我有帮助的评论,我对此表示非常感谢。