gpt4 book ai didi

c# - `System.Type` 如何成为具有约束的通用参数?

转载 作者:行者123 更新时间:2023-11-30 20:24:50 31 4
gpt4 key购买 nike

System.Type 如何成为具有约束的通用参数?

这里的接口(interface) I 有一个方法 M ,类 CD 实现。

public interface I {
void M;
}

public class C: I {
public void M();
}
public class D: I {
public void M();
}

服务实例化一个新的 T()(实际上是 C/D 实现 I)并运行 I 上面的接口(interface)方法

public class Service {
public void Fn<T>(T t): where T : Type, I, new() {
( new t() ).M();
// ...
}
}

这最终将成为该服务的公共(public) API,因此我希望它尽可能简洁:

public class Main {
public void main() {
Service.Fn( typeof( C ));
Service.Fn( typeof( D ));
// ...
}
}

这不是编译,错误是:“System.Type”必须是具有公共(public)无参数构造函数的非抽象类型,以便将其用作泛型类型或方法中的参数“T”...

这里的最终目标是能够简洁地调用 Service.Fn,如 Main 中所述。也欢迎对我的界面尝试进行任何替代。

最佳答案

以下代码适用于我:

public class Service {
public void Fn<T>() where T : I, new() {
(new T()).M();
// ...
}
}
public interface I
{
void M();
}

public class C : I
{
public void M();
}
public class D : I
{
public void M();
}

static void Main()
{
var service = new Service();
service.Fn<C>();
service.Fn<D>();
}

问题是多余的 Typewhere条款。 T无论如何它是一个类型,因为它是一个通用参数 - 但是类型为 A 的对象或 B不会被转换为 Type类-这就是where T : Type会意味着。

一般来说,where T: X, Y, Z意味着任何 T必须(取决于 XYZ 是什么)实现接口(interface),或者是 X 的子类, YZ . new() constraint 略有不同,它使编译器知道您还希望能够创建类型为 T 的新对象在方法中。 (有关详细信息,请参阅 http://msdn.microsoft.com/en-gb/library/bb384067.aspxhttp://msdn.microsoft.com/en-gb/library/d5x73970.aspx)

另外,我删除了 typeOf()从您的输入中,当您使用泛型时,可以在函数中直接引用类型(见上文)。希望这是有道理的。有任何问题,尽管问!

关于c# - `System.Type` 如何成为具有约束的通用参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25879454/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com