泛型类型作为参数,必须实现特定的接口

时间:2018-09-17 11:50:11

标签: c# generics interface

我有一种方法想要重新创建更通用的方法。

public Task<bool> DoSomething<T>(T t) where T : Type, IAnyInterface

如您所见,我想要一个 Type 作为参数,该参数必须实现 IAnyInterface

但是,如果我调用该方法,

DoSomething(typeof(ObjectThatImplementsIAnyInterface));

我得到一个错误:

  

类型'System.Type'不能用作通用类型或方法'DoSomething(...)'中的类型参数'T',没有从'System.Type'到'IAnyInterface'的隐式转换

那么我如何才能完成该方法接受该类型的操作呢?

3 个答案:

答案 0 :(得分:4)

  

不想转移实例,否则我想在DoSomething(...)方法内部创建实例

然后只需忽略该参数。在您的情况下,这似乎毫无用处。让规范在通用调用中完成:

public Task<bool> DoSomething<T>() where T : IAnyInterface
{
    Type type = typeof(T);
    // Or create the entire instance:
    T newInstance = Activator.CreateInstance<T>();
}

致电:

DoSomething<ObjectThatImplementsIAnyInterface>();

编辑:创建实例的另一种方法是要求无参数构造函数:

public Task<bool> DoSomething<T>() where T : IAnyInterface, new()
{
    T newInstance = new T();
}

documentation of CreateInstance

答案 1 :(得分:1)

您只是想要

public Task<bool> DoSomething<T>(T t) where T : IAnyInterface

其中定义T是必须实现IAnyInterface的类型。

以上内容使您可以将实例作为参数传递并推断T

DoSomething(new ObjectThatImplementsIAnyInterface());

有关类型约束的更多信息:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters


根据您的评论:

  

我不想转移实例,否则我想在方法内部创建实例

听起来您可能需要new()约束,该约束允许您在方法内部创建实例(注意:您将需要无参数ctor):

public Task<bool> DoSomething<T>() where T : IAnyInterface, new()
{
    // now you can do this:
    IAnyInterface inst = new T();
}

发出DoSomething<ObjectThatImplementsIAnyInterface>()通话。

当然,您可以采用一种方法来传递或创建它

public Task<bool> DoSomething<T>(T t = null) where T : class, IAnyInterface, new()
{
    // now you can do this:
    IAnyInterface inst = t ?? new T();
}

如果您想在运行时知道实际类型,那就简单

var runtimeType = typeof(T);

答案 2 :(得分:-1)

您在说错了。您需要传递实现接口的对象,而不是类型:

DoSomething(new ObjectThatImplementsIAnyInterface());