反映返回的扩展方法没有定义"

时间:2018-06-14 17:50:18

标签: c# visual-studio-2017 .net-4.6

我正在运行.net 4.6应用程序。

我使用反射来查找扩展方法ToHashSet

此方法was introduced in .net 4.7.2和"不会"存在于4.6

enter image description here

以下程序成功。它能够找到并反思这种不存在的方法。

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对象或其他东西来检测这个?

1 个答案:

答案 0 :(得分:0)

虽然您的应用程序以框架版本4.6为目标,但这意味着它可以运行的框架的最低版本。这种定位基本上告诉编译器什么是&#39; API&#39;在开发和编译程序时可用,但记住反射没有编译时安全性。它只是在运行时执行您所说的内容,并且您希望它能够正常工作。

在您的示例中,您运行的框架版本(非定位)是4.7.2。我知道这是因为您通过反射找到了一个仅存在于4.7.2上的方法