我正在运行.net 4.6应用程序。
我使用反射来查找扩展方法ToHashSet
此方法was introduced in .net 4.7.2和"不会"存在于4.6
中以下程序成功。它能够找到并反思这种不存在的方法。
using System;
using System.Collections.Generic;
using System.Reflection;
namespace TestAppNS
{
class Program
{
static void Main(string[] args) {
var toHashSet = GetExtensionMethods(typeof(Enumerable)).First(x => x.Name == "ToHashSet");
}
private static IEnumerable<MethodInfo> GetExtensionMethods(Type type) {
return
from method in type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
where method.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false)
select method;
}
}
}
为什么会这样?
有没有办法通过查看MethodInfo
对象或其他东西来检测这个?
答案 0 :(得分:0)
虽然您的应用程序以框架版本4.6为目标,但这意味着它可以运行的框架的最低版本。这种定位基本上告诉编译器什么是&#39; API&#39;在开发和编译程序时可用,但记住反射没有编译时安全性。它只是在运行时执行您所说的内容,并且您希望它能够正常工作。
在您的示例中,您运行的框架版本(非定位)是4.7.2。我知道这是因为您通过反射找到了一个仅存在于4.7.2上的方法