123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- using AspectCore.Extensions.Reflection;
- using Microsoft.AspNetCore.Hosting;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Reflection;
- using System.Reflection.Metadata;
- using TEAMModelOS.SDK.Context.Attributes.Azure;
- namespace TEAMModelOS.SDK.Helper.Common.ReflectorExtensions
- {
- public static class ReflectorExtensions
- {
- public static T GetPropertyValue<T>(this object obj, string name, BindingFlags bindingFlags) where T : class
- {
- var chProperty = obj.GetType().GetTypeInfo().GetProperty(name, bindingFlags);
- var chReflector = chProperty.GetReflector();
- var value = chReflector.GetValue(obj) as T;
- return value;
- }
- public static Tuple<T, FieldInfo> GetFieldValue<T>(this object obj, string name, BindingFlags bindingFlags) where T : class
- {
- var chField = obj.GetType().GetTypeInfo().GetField(name, bindingFlags);
- var chReflector = chField.GetReflector();
- var value = chReflector.GetValue(obj) as T;
- return Tuple.Create(value, chField);
- }
- public static T GetFieldValue<T>(this Type type, string name, BindingFlags bindingFlags) where T : class
- {
- var chField = type.GetTypeInfo().GetField(name, bindingFlags);
- var chReflector = chField.GetReflector();
- var value = chReflector.GetValue(null) as T;
- return value;
- }
- /// <summary>
- /// 获取T类型的属性标记的类的方法集合
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <returns></returns>
- public static List<Attribute> GetMethodCustomAttribute<T>(string[] ScanModel)
- {
- Type attr = typeof(T);
- string currentDirectory = Path.GetDirectoryName(attr.Assembly.Location);
- List<Attribute> attributes = new List<Attribute>();
- if (ScanModel != null)
- {
- foreach (var model in ScanModel)
- {
- Assembly assembly = Assembly.LoadFrom(currentDirectory + "\\" + model + ".dll");
- var TypeInModelS = assembly.GetTypes().SelectMany(x => x.GetMethods()).GroupBy(z=>z.Name).ToList();
- TypeInModelS.ForEach(x => {
- if (x.Key.Equals("GetTeacherInfo"))
- {
- var at = x.ToList().SelectMany(z => z.GetCustomAttributes()).Where(m=>m.GetType().Equals(attr));
- string ke = x.Key;
- }
- });
- var TypeInModel = assembly.GetTypes().Select(x => x.GetMethods()).SelectMany(y => y).Select(z=>z.GetCustomAttribute(attr,true)).Where(n=>n!=null);
- attributes.AddRange(TypeInModel);
- }
- }
- return attributes;
- }
- /// <summary>
- /// 获取T类型的属性标记的类的方法集合
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <returns></returns>
- public static List<Attribute> GetMethodCustomAttribute<T,V>(string[] ScanModel)
- {
- Type attrT = typeof(T);
- Type attrV = typeof(V);
- string currentDirectory = Path.GetDirectoryName(attrT.Assembly.Location);
- List<Attribute> attributes = new List<Attribute>();
- if (ScanModel != null)
- {
- foreach (var model in ScanModel)
- {
- Assembly assembly = Assembly.LoadFrom(currentDirectory + "\\" + model + ".dll");
- var TypeInModelS = assembly.GetTypes().SelectMany(x => x.GetMethods()).GroupBy(z => z.Name).ToList();
- // var TypeInModelSS = assembly.GetTypes().SelectMany(x => x.GetMethods()).Where(x=>);
- TypeInModelS.ForEach(x => {
- if (x.Key.Equals("GetTeacherInfo"))
- {
- var at = x.ToList().SelectMany(z => z.GetCustomAttributes()).Where(m => m.GetType().Equals(attrT));
- string ke = x.Key;
- }
- });
- var TypeInModel = assembly.GetTypes().Select(x => x.GetMethods()).SelectMany(y => y).Select(z => z.GetCustomAttribute(attrT, true)).Where(n => n != null);
- attributes.AddRange(TypeInModel);
- }
- }
- return attributes;
- }
- /// <summary>
- /// 获取T类型属性标记的类集合
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <returns></returns>
- public static List<Type> GetAllTypeAsAttribute<T>(string[] ScanModel)
- {
- Type attr = typeof(T);
- string currentDirectory = Path.GetDirectoryName(attr.Assembly.Location);
- List<Type> types = new List<Type>();
- if (ScanModel != null)
- {
- foreach (var model in ScanModel)
- {
- Assembly assembly = Assembly.LoadFrom(currentDirectory + "\\" + model + ".dll");
- // Assembly assembly = Assembly.GetCallingAssembly();
- var TypeInModel = from t in assembly.GetTypes()
- let attributes = t.GetCustomAttributes(attr, true)
- where attributes != null && attributes.Length > 0
- select t;
- types.AddRange(TypeInModel);
- }
- }
- return types;
- }
- }
- }
|