using Serein.Library.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using static Serein.Library.Utils.EmitHelper;
namespace Serein.Library
{
///
/// 通过 Emit 创建委托,代替反射调用方法,实现高性能的动态调用。
/// 一般情况下你无须内部细节,只需要调用 Invoke() 方法即可。
///
public class DelegateDetails
{
private readonly EmitType emitType = EmitType.None;
///
/// 创建的委托类型
///
public enum EmitType
{
///
/// 默认
///
None,
///
/// 方法调用
///
MethodInvoke,
///
/// 字段赋值
///
FieldSetter,
///
/// 字段取值
///
FieldGetter,
///
/// 属性赋值
///
PropertySetter,
///
/// 属性取值
///
PropertyGetter,
///
/// 集合取值
///
CollectionGetter,
///
/// 集合赋值
///
CollectionSetter
}
///
/// 表示方法的类型
///
public enum GSType
{
///
/// 获取值
///
Get,
///
/// 设置值
///
Set,
}
///
/// 根据方法信息构建Emit委托
///
///
public DelegateDetails(MethodInfo methodInfo)
{
emitType = EmitType.MethodInvoke;
var emitMethodType = EmitHelper.CreateDynamicMethod(methodInfo, out var emitDelegate);
_emitMethodInfo = emitMethodType;
_emitDelegate = emitDelegate;
methodType = _emitMethodInfo.EmitMethodType;
if (_emitDelegate is Func