In the interest of self-improvement and sharing knowledge, I felt that I should share an update to my last post. I discovered a slightly better way to create the GetMimeMapping delegate/method via reflection that involves less casting and overhead, and is more Object Oriented in a sense. It allows the signature of the reflected method to be Func<string, string> instead of MethodInfo. Code below, note the use of Delegate.CreateDelegate(Type, MethodInfo):
/// <summary>
/// Exposes the Mime Mapping method that Microsoft hid from us.
/// </summary>
public static class MimeMappingStealer
{
// The get mime mapping method
private static readonly Func<string, string> _getMimeMappingMethod = null;
/// <summary>
/// Static constructor sets up reflection.
/// </summary>
static MimeMappingStealer()
{
// Load hidden mime mapping class and method from System.Web
var assembly = Assembly.GetAssembly(typeof(HttpApplication));
Type mimeMappingType = assembly.GetType("System.Web.MimeMapping");
_getMimeMappingMethod =
(Func<string, string>)Delegate.CreateDelegate(typeof(Func<string, string>),
mimeMappingType.GetMethod("GetMimeMapping",
BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.FlattenHierarchy));
}
/// <summary>
/// Exposes the hidden Mime mapping method.
/// </summary>
/// <param name="fileName">The file name.</param>
/// <returns>The mime mapping.</returns>
public static string GetMimeMapping(string fileName)
{
return _getMimeMappingMethod(fileName);
}
}