为什么反射搜索突然找不到任何东西?

mar*_*are 3 c# reflection mime-types

根据这个问题和答案,我有以下代码如何获取ASP.NET C#中请求的文件的MIME类型? 它工作得非常好:

    static MimeMappingWrapper()
    {
        // dirty trick - Assembly.LoadWIthPartialName has been deprecated        
        //Assembly ass = Assembly.LoadWithPartialName("System.Web");
        Assembly ass = Assembly.GetAssembly(typeof (HttpApplication));
        Type mimeMappingType = ass.GetType("System.Web.MimeMapping");

        GetMimeMappingMethod = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic);
    }
Run Code Online (Sandbox Code Playgroud)

现在突然mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic)回来了null.

可能是什么原因?在应用程序中没有更改任何特殊内容,即使它是,它如何影响包装类的构造函数?

Dou*_*las 5

我的猜测是服务器上安装的.NET Framework已升级,私有构造函数不再出现在新版本下.

允许程序集开发人员(在本例中为Microsoft)随心所欲地更改任何私有(或内部)类型或成员,而不会将其视为重大变更.

编辑:我在.NET 4.0下检查了我的电脑,方法仍然存在.这是它的签名:

// System.Web.MimeMapping
internal static string GetMimeMapping(string FileName)
Run Code Online (Sandbox Code Playgroud)

在这一点上,我的两个建议是在运行时检查你的实际.NET版本......

var version = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion();
Run Code Online (Sandbox Code Playgroud)

...并枚举MimeMapping类的方法以检查它们是否符合您的期望:

var methods = mimeMappingType.GetMethods(BindingFlags.Static | BindingFlags.NonPublic);
Run Code Online (Sandbox Code Playgroud)

更新:好消息是MimeMapping类及其GetMimeMapping方法似乎可以在.NET 4.5中公开.

但是,这意味着您的代码肯定会破坏,因为您只是在搜索NonPublic方法.尝试执行全包搜索,看看是否GetMimeMapping显示:

var methods = mimeMappingType.GetMethods(
    BindingFlags.Instance | 
    BindingFlags.Static | 
    BindingFlags.Public |
    BindingFlags.NonPublic | 
    BindingFlags.FlattenHierarchy);
Run Code Online (Sandbox Code Playgroud)