[置顶] 反射在泛型中的应用

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);




你可能感兴趣的:(泛型,反射)