在反射枚举类型的时候,为什么获取不到TryParse方法??

.Net技术 码拜 10年前 (2015-05-10) 1038次浏览 0个评论
 
  
    public enum OperateType
    {
        Success = 1,
        Fail = 0,
       }
typeof(OperateType).GetMethods("TryParse",new Type[]{typeof(string),typeof(OperateType).MakeByRefType()});
typeof(OperateType).GetMethods("TryParse").FirstOrDefault(x => x.Name == "TryParse" && x.GetParemeteres().Length == 2)
 

//以上两种方式都获取不到tryparse方法,监视GetMethods的返回值的时候,也没见着TryParse,不知道怎么回事

40分
TryParse 方法不是在OperateType 这个对像里的。
他是一个Enum静太方法。你应是从Enum中去取
40分
Type temp =  typeof (System.Enum);
MethodInfo methods = temp.GetMethod();

这里面有TryParse.

晕,少了个s

Type temp =  typeof (System.Enum);
MethodInfo methods = temp.GetMethods();

这里面有TryParse.

再晕,返回类型也错了

           Type temp =  typeof (System.Enum);
            MethodInfo[] methods = temp.GetMethods();

40分
静态类就应该找相应的位置
Enum是对具体的enum的一些相关静态方法支持
父类的方法只能去父类找?
40分
引用 6 楼 moonwrite 的回复:

父类的方法只能去父类找?

首先反射可以找到基类中的方法。

但是,枚举类型比较特殊,运行时,它实际基类并非Enum,而是int,long之类的类型,这些类型也有TryParse ,但显然这些TryParse 并非你需要的。
针对枚举类型,还是用Enum.TryParse 处理。

40分
因为TryParse是静态函数,因此绑定参数为BindingFlags.Static;
因为TryParse定义在祖先(父)类,因此要BindingFlags.FlattenHierarchy:

var methodInfo = typeof(OperateType)
    .GetMethods(BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.Public)
    .First(x => x.Name == "TryParse" && x.GetParameters().Length == 2);
methodInfo = methodInfo.MakeGenericMethod(typeof(OperateType));
                
object[] parameters = new object[]{"Success", null};
methodInfo.Invoke(null, parameters);

OperateType result = (OperateType)parameters[1];  // OperateType.Success

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在反射枚举类型的时候,为什么获取不到TryParse方法??
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!