当前位置:  开发笔记 > 编程语言 > 正文

如果在运行时类型未知,您可以在C#中使用泛型方法吗?

如何解决《如果在运行时类型未知,您可以在C#中使用泛型方法吗?》经验,为你挑选了2个好方法。

解释我的意思的最简单方法是使用代码示例.这不能编译,但有没有办法实现这个效果:

foreach(Type someType in listOfTypes)
{
    SomeMethod();
}

如果可行的话会非常方便,但事实并非如此.是否有其他方法可以实现与上述相同的事情,为什么C#不允许这是一个法律声明?

编辑:似乎唯一的方法是通过反射,这可能对我们的需求来说太慢了.任何洞察为什么没有内置的有效方法以及这样的事情是否适用于C#4.0?



1> Kent Boogaar..:

你可以使用反射.假设当前对象包含该SomeMethod()方法,执行此操作的代码将如下所示:

GetType().GetMethod("SomeMethod").
    MakeGenericMethod(new Type[] { someType }).Invoke(this, null);

请注意,如果SomeMethod()是非公开的,则您的代码可能无法在较低信任的环境中执行.



2> John Feminel..:

为什么C#不允许这是一个法律声明?

正如其他人所说,你不能这样做.为什么不?好吧,考虑你的例子:

foreach(Type someType in listOfTypes)
{
    SomeMethod();
}

请注意,类型列表中的每个类型在运行时才能知道,而类型参数SomeMethod必须在编译时才知道.编译器不可能告诉哪个 SomeMethod解析你的调用,所以这是非法的.

在C#4中,通过将DLR包含到CLR中,可以实现这个和许多其他类似的事情.特别是,动态方法调用将使您能够调用在编译时可能不知道的方法.


别担心,没有难过的感觉!StackOverflow充满了不被接受的好答案.你选择了一个能够捕捉到你最重要意义的东西 - 我只是为了好奇而添加了一些额外的信息.;)
推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有