我有一种方法想要重新创建更通用的方法。
public Task<bool> DoSomething<T>(T t) where T : Type, IAnyInterface
如您所见,我想要一个 Type 作为参数,该参数必须实现 IAnyInterface
但是,如果我调用该方法,
DoSomething(typeof(ObjectThatImplementsIAnyInterface));
我得到一个错误:
类型'System.Type'不能用作通用类型或方法'DoSomething(...)'中的类型参数'T',没有从'System.Type'到'IAnyInterface'的隐式转换>
那么我如何才能完成该方法接受该类型的操作呢?
答案 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();
}
答案 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());