繁体   English   中英

Activator.CreateInstance(Type T)返回null

[英]Activator.CreateInstance(Type T) returns null

编辑:此代码作为统一的自定义检查器代码运行,但是我不确定是否相关,如果可以,我将发布整个类。

我想获取实现特定接口的所有类,并显示一个选项列表,以便用户可以选择如何实现该接口。

它是描述角色行为的简单界面。

我试图用抽象类替换接口,但是没有用...

在调试中,我可以看到返回的值为null。

我在网上找到的所有内容都说该类型可能不存在,但在我的情况下是不可能的,因为我是使用反射来获得该类型的。

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变量仍然为null ...

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);
    }

在UpdateType方法中创建类型之前,请加载所有程序集。

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;

    }
}

希望这可以帮助。

解决方案非常简单。 问题不在代码中,而在Unity3D中。

Unity将类FightBehaviourEscapeBehaviour创建为MonoBehaviour类,无法实例化。 因此,我需要将其设置为普通班级。

感谢所有对我有帮助的评论,我真的很感激。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM