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的枚举加入条件筛选(NonPulic、Static、Public、IgnoreCase、Instance等)
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有两个方法GetParameters和GetGenericArguments,分别是获取参数信息和泛型参数。
如:public stringGetSomething<T, Tkey>(string id, T obj, Tkey value, bool flag);
上述情况下,GetParameters会得到所有参数信息,但是GetGenericArguments的返回结果是仅包含T和Tkey的长度为2的结果数组。
上述的示例代码的意思即时:获取参数数量为1,且只有1个泛型参数的名称为Add的方法。当然上述的方法比较严格,有些判断比较多余。
3.泛型方法的调用和执行
在获取的泛型MethodInfo以后,需要调用MethodInfo的MakeGenericMethod方法生成新的方法。
传入参数为GetGenericArguments对应的参数顺序的实际参数Type类型。
MethodInfo methodNew = method.MakeGenericMethod(t);