限制可以通过接口传递给方法的类型

时间:2017-01-02 15:40:01

标签: c# reflection interface

如何将类型传递给继承特定接口的方法。

实施例

我有一个界面

public interface iBase
{
    void DoWork(object t);

}

我有一个实现接口的类

public class WorkerClass : iBase
{
    public void DoWork(object t)
    {

    }
}

以下代码使用上面的两个类

class Program
{
    static void Main(string[] args)
    {
        Start(typeof(WorkerClass));
    }

    public static void Start(Type type)
    {
        iBase workerClass = (iBase)Activator.CreateInstance(type);

        workerClass.DoWork("tst");
    }
}

上面的代码有效,但我想这样做,所以Start的输入参数(Type type)只接受从iBase继承的类型。目前"类型"将接受任何不是我想要的类型。

2 个答案:

答案 0 :(得分:3)

您可以使用泛型来执行此操作:

public static void Start<T>() where T : iBase
{
    iBase workerClass = (iBase)Activator.CreateInstance(typeof(T));

    workerClass.DoWork("tst");
}

T是泛型类型参数,where约束确保只接受实现iBase的类型。
typeof运算符用于获取指定类型的Type实例。

您可以这样称呼它:

Start<WorkerClass>();

WorkerClass是泛型类型参数。

关于泛型的进一步阅读:

答案 1 :(得分:3)

class Program
{
    static void Main(string[] args)
    {
        Start<WorkerClass>();
    }

    public static void Start<T>() where T : iBase
    {
        iBase workerClass = (iBase)Activator.CreateInstance(typeof(T));

        workerClass.DoWork("tst");
    }
}

如果您可以通过确保您的类型在编译时具有公共无参数构造函数来删除反射,那就更好了:

    public static void Start<T>() where T : iBase, new()
    {
        var instance = new T();

        instance.DoWork("tst");
    }