C# 限制什么类型’;s可以通过接口传递给方法

C# 限制什么类型’;s可以通过接口传递给方法,c#,reflection,interface,C#,Reflection,Interface,如何将类型传递给继承特定接口的方法 范例 我有一个接口 public interface iBase { void DoWork(object t); } public class WorkerClass : iBase { public void DoWork(object t) { } } 我有一个实现接口的类 public interface iBase { void DoWork(object t); } public class Wo

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

范例

我有一个接口

public interface iBase
{
    void DoWork(object t);

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

    }
}
我有一个实现接口的类

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继承的类型。目前,“类型”将接受任何不是我想要的类型。

您可以使用泛型来实现这一点:

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

    workerClass.DoWork("tst");
}
WorkerClass
作为泛型类型参数


关于泛型的进一步阅读:


您可以使用泛型来实现这一点:

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

    workerClass.DoWork("tst");
}
WorkerClass
作为泛型类型参数


关于泛型的进一步阅读:

课程计划
{
静态void Main(字符串[]参数)
{
Start();
}
公共静态void Start(),其中T:iBase
{
iBase workerClass=(iBase)Activator.CreateInstance(typeof(T));
工人阶级道工(“tst”);
}
}
如果您可以通过确保您的类型在编译时具有公共的无参数构造函数来删除反射,则更好:

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

        instance.DoWork("tst");
    }
publicstaticvoidstart(),其中T:iBase,new()
{
var instance=newt();
例如:道工(“tst”);
}
课程计划
{
静态void Main(字符串[]参数)
{
Start();
}
公共静态void Start(),其中T:iBase
{
iBase workerClass=(iBase)Activator.CreateInstance(typeof(T));
工人阶级道工(“tst”);
}
}
如果您可以通过确保您的类型在编译时具有公共的无参数构造函数来删除反射,则更好:

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

        instance.DoWork("tst");
    }
publicstaticvoidstart(),其中T:iBase,new()
{
var instance=newt();
例如:道工(“tst”);
}
+1表示
new()
约束。首先我不想添加这个,因为我不确定这是否也适用于结构。对于
new()
约束,它是+1。首先我不想添加这个,因为我不确定这是否也适用于结构。是的。