using System;
using System.Reflection;
using System.Linq;
public static class TypeExtensions {
public static MethodInfo GetMethod(this Type type, string name, BindingFlags bindingAttr, Type[] types, Type returnType ) {
var methods = type
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(mi => mi.Name == "op_Explicit")
.Where(mi => mi.ReturnType == typeof(int));
if (!methods.Any())
return null;
if (methods.Count() > 1)
throw new System.Reflection.AmbiguousMatchException();
return methods.First();
}
public static MethodInfo GetImplicitCastToMethod(this Type type, Type returnType )
{
return type.GetMethod("op_Implicit", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[] { type }, returnType);
}
public static MethodInfo GetExplicitCastToMethod(this Type type, Type returnType )
{
MethodInfo method = null;
method = type.GetMethod("op_Explicit", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[] { type }, returnType);
if (method != null)
return method;
method = returnType.GetMethod("op_Explicit", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, new Type[] { returnType }, type);
return method;
}
}
public class Test
{
public static void Main()
{
MethodInfo m = typeof(IntPtr).GetImplicitCastToMethod(typeof(int));
Console.WriteLine(m);
object d = m.Invoke(null, new object[] { new IntPtr(0) });
Console.WriteLine(d);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKdXNpbmcgU3lzdGVtLkxpbnE7CgoKcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlRXh0ZW5zaW9ucyB7CiAgICAKICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSW5mbyBHZXRNZXRob2QodGhpcyBUeXBlIHR5cGUsIHN0cmluZyBuYW1lLCBCaW5kaW5nRmxhZ3MgYmluZGluZ0F0dHIsIFR5cGVbXSB0eXBlcywgVHlwZSByZXR1cm5UeXBlICkgewogICAgICAgIHZhciBtZXRob2RzID0gdHlwZQogICAgICAgICAgICAuR2V0TWV0aG9kcyhCaW5kaW5nRmxhZ3MuU3RhdGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYykKICAgICAgICAgICAgLldoZXJlKG1pID0+IG1pLk5hbWUgPT0gIm9wX0V4cGxpY2l0IikKICAgICAgICAgICAgLldoZXJlKG1pID0+IG1pLlJldHVyblR5cGUgPT0gdHlwZW9mKGludCkpOwogICAgICAgIAogICAgICAgIGlmICghbWV0aG9kcy5BbnkoKSkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgCiAgICAgICAgaWYgKG1ldGhvZHMuQ291bnQoKSA+IDEpCiAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uUmVmbGVjdGlvbi5BbWJpZ3VvdXNNYXRjaEV4Y2VwdGlvbigpOwogICAgICAgICAgICAKICAgICAgICAKICAgICAgICByZXR1cm4gbWV0aG9kcy5GaXJzdCgpOwogICAgfQogICAgCiAgICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSW5mbyBHZXRJbXBsaWNpdENhc3RUb01ldGhvZCh0aGlzIFR5cGUgdHlwZSwgVHlwZSByZXR1cm5UeXBlICkgCiAgICB7ICAgICAgICAKICAgICAgICByZXR1cm4gdHlwZS5HZXRNZXRob2QoIm9wX0ltcGxpY2l0IiwgQmluZGluZ0ZsYWdzLlN0YXRpYyB8IEJpbmRpbmdGbGFncy5QdWJsaWMgfCBCaW5kaW5nRmxhZ3MuTm9uUHVibGljLCBuZXcgVHlwZVtdIHsgdHlwZSB9LCByZXR1cm5UeXBlKTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyBNZXRob2RJbmZvIEdldEV4cGxpY2l0Q2FzdFRvTWV0aG9kKHRoaXMgVHlwZSB0eXBlLCBUeXBlIHJldHVyblR5cGUgKSAKICAgIHsgICAgICAgIAogICAgICAgIE1ldGhvZEluZm8gbWV0aG9kID0gbnVsbDsKICAgICAgICAKICAgICAgICBtZXRob2QgPSB0eXBlLkdldE1ldGhvZCgib3BfRXhwbGljaXQiLCBCaW5kaW5nRmxhZ3MuU3RhdGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyB8IEJpbmRpbmdGbGFncy5Ob25QdWJsaWMsIG5ldyBUeXBlW10geyB0eXBlIH0sIHJldHVyblR5cGUpOwogICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKICAgICAgICAKICAgICAgICBtZXRob2QgPSByZXR1cm5UeXBlLkdldE1ldGhvZCgib3BfRXhwbGljaXQiLCBCaW5kaW5nRmxhZ3MuU3RhdGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyB8IEJpbmRpbmdGbGFncy5Ob25QdWJsaWMsIG5ldyBUeXBlW10geyByZXR1cm5UeXBlIH0sIHR5cGUpOwogICAgICAgIHJldHVybiBtZXRob2Q7ICAgICAgICAgICAgIAogICAgfQogICAgCgp9CgpwdWJsaWMgY2xhc3MgVGVzdAp7CiAgICAKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsgICAgICAgCiAgICAgICAgCiAgICAgICAgTWV0aG9kSW5mbyBtID0gdHlwZW9mKEludFB0cikuR2V0SW1wbGljaXRDYXN0VG9NZXRob2QodHlwZW9mKGludCkpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKG0pOwogICAgICAgIG9iamVjdCBkID0gbS5JbnZva2UobnVsbCwgbmV3IG9iamVjdFtdIHsgbmV3IEludFB0cigwKSB9KTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShkKTsKCX0KfQ==