简体   繁体   English

创建实现给定接口的对象的实例

[英]Creating instance of an object which implements a given interface

I am trying to construct an object with Activator.CreateInstance(), however i am receiving null for some unknown to me reason. 我正在尝试使用Activator.CreateInstance()构造一个对象,但是由于某些我未知的原因,我收到了null。

public class SpawnManager
{

    public void CreateSpawnable<T>()
    {
        Type type = typeof(T);

        ISpawnable<SpawnableParameters> spawnable = Activator.CreateInstance(type) as ISpawnable<SpawnableParameters>;

        // the spawnable object always returns null
    }

    public void Start()
    {
        CreateSpawnable<SpawnableCollectible>();
    }

}


public class SpawnableCollectible : ISpawnable<ParametersCollectible>
{

    public void Spawn(ParametersCollectible parameters)
    {
    }

}

Can somebody explain why i can't create an object instance which implements the given interface like that and write the correct approach for instantiating such an object? 有人可以解释为什么我无法创建一个实现给定接口的对象实例,并编写用于实例化此类对象的正确方法吗?

Your types do not match. 您的类型不匹配。 SpawnableCollectible implements ISpawnable<ParametersCollectible> not ISpawnable<SpawnableParameters> so the cast fails and as operator returns null . SpawnableCollectible实现ISpawnable<ParametersCollectible>而不是ISpawnable<SpawnableParameters>因此ISpawnable<SpawnableParameters>失败, as运算符返回null

To add to what Selman22 said: 要补充Selman22所说的话:

You'll probably want to constrain T to be a type that derives from ISpawnable<SpawnableParameters> . 您可能希望将T约束为从ISpawnable<SpawnableParameters>派生的类型。 This will fix your problem: 这将解决您的问题:

public void CreateSpawnable<T>() where T: ISpawnable<SpawnableParameters>
{
    //...
}

This way, the client code cannot invoke your method with an invalid type T , and the as cast will always succeed. 这样,客户端代码无法使用类型T调用无效的方法,并且as强制转换将始终成功。

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

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