反射在泛型中的应用

来源:互联网 发布:怎样查看自己的淘宝号 编辑:程序博客网 时间:2024/04/29 16:52

1.在泛型中通过反射获取对象属性值和对普通类的操作一样

      Type type = typeof(T);      PropertyInfo property = type.GetProperty(propertyname);      if (property == null) return string.Empty;      object o = property.GetValue(t, null);      if (o == null) return string.Empty;      return o.ToString();

GetProperty的方法中,有重载函数,可以通过传入BindingFlags的枚举加入条件筛选(NonPulicStaticPublicIgnoreCaseInstance等)

2.获取泛型方法以及方法调用

一般来说泛型的方法获取同属性的获取一样,但是对于有重载函数的情况,就需要特殊处理了。这种情况,通过GetMethod方法便会出错,方法执行会存在两个或多个结果,系统会抛出异常。

现有Add方法定义如下:

public string Add<T>(T doc) where T : class;public string Add<T>(T doc, AuthInfo authInfo) where T : class;
要获取Add方法,只能通过GetMethods方法进行筛选了

MethodInfo method = repository.GetType().GetMethods()                         .Where(m => m.Name == "Add").Select(m => new                         {                             Method = m,                             Params = m.GetParameters(),                             Args = m.GetGenericArguments()                         })                         .Where(x => x.Params.Length == 1                                     && x.Args.Length == 1                                     && x.Params[0].ParameterType == x.Args[0])                         .Select(x => x.Method)                         .First();

非泛型的方法获取,可以直接通过参数数量判断,但是如果泛型、非泛型等多种重载存在时,则需要仔细判断了。

MethodInfo有两个方法GetParametersGetGenericArguments,分别是获取参数信息和泛型参数。

如:public stringGetSomething<T, Tkey>(string id, T obj, Tkey value, bool flag);

上述情况下,GetParameters会得到所有参数信息,但是GetGenericArguments的返回结果是仅包含TTkey的长度为2的结果数组。

上述的示例代码的意思即时:获取参数数量为1,且只有1个泛型参数的名称为Add的方法。当然上述的方法比较严格,有些判断比较多余。

3.泛型方法的调用和执行

在获取的泛型MethodInfo以后,需要调用MethodInfoMakeGenericMethod方法生成新的方法。

传入参数为GetGenericArguments对应的参数顺序的实际参数Type类型。

MethodInfo methodNew = method.MakeGenericMethod(t);




0 0
原创粉丝点击