mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-06 17:50:48 +08:00
重写了Web Api的逻辑,用Emit构造委托加速API处理
This commit is contained in:
@@ -11,11 +11,13 @@ namespace Net462DllTest.Utils
|
||||
{
|
||||
public interface IGSModel<TKey, TModel>
|
||||
{
|
||||
TModel Value { get; set; }
|
||||
//TModel Value { get; set; }
|
||||
void Set(TKey tEnum, object value);
|
||||
object Get(TKey tEnum);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 通过 Emit 创建 set/get 委托
|
||||
/// </summary>
|
||||
@@ -23,7 +25,8 @@ namespace Net462DllTest.Utils
|
||||
where TKey : struct, Enum
|
||||
where TModel : class
|
||||
{
|
||||
public TModel Value { get; set; }
|
||||
private TModel Value;
|
||||
|
||||
public GSModel(TModel Model)
|
||||
{
|
||||
this.Value = Model;
|
||||
@@ -32,55 +35,6 @@ namespace Net462DllTest.Utils
|
||||
private readonly Dictionary<TKey, Action<TModel, object>> _setterCache = new Dictionary<TKey, Action<TModel, object>>();
|
||||
private readonly Dictionary<TKey, Func<TModel, object>> _getterCache = new Dictionary<TKey, Func<TModel, object>>();
|
||||
|
||||
// 动态创建调用Setter方法
|
||||
private Action<TModel, object> CreateSetter(PropertyInfo property)
|
||||
{
|
||||
var method = new DynamicMethod("Set" + property.Name, null, new[] { typeof(TModel), typeof(object) }, true);
|
||||
var il = method.GetILGenerator();
|
||||
|
||||
il.Emit(OpCodes.Ldarg_0); // 加载实例(PlcVarValue)
|
||||
il.Emit(OpCodes.Ldarg_1); // 加载值(object)
|
||||
|
||||
if (property.PropertyType.IsValueType)
|
||||
{
|
||||
il.Emit(OpCodes.Unbox_Any, property.PropertyType); // 解箱并转换为值类型
|
||||
}
|
||||
else
|
||||
{
|
||||
il.Emit(OpCodes.Castclass, property.PropertyType); // 引用类型转换
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Callvirt, property.GetSetMethod()); // 调用属性的Setter方法
|
||||
il.Emit(OpCodes.Ret); // 返回
|
||||
|
||||
|
||||
|
||||
return (Action<TModel, object>)method.CreateDelegate(typeof(Action<TModel, object>));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 动态创建调用Getter方法
|
||||
/// </summary>
|
||||
/// <param name="property"></param>
|
||||
/// <returns></returns>
|
||||
private Func<TModel, object> CreateGetter(PropertyInfo property)
|
||||
{
|
||||
var method = new DynamicMethod("Get" + property.Name, typeof(object), new[] { typeof(TModel) }, true);
|
||||
var il = method.GetILGenerator();
|
||||
|
||||
il.Emit(OpCodes.Ldarg_0); // 加载实例(PlcVarValue)
|
||||
il.Emit(OpCodes.Callvirt, property.GetGetMethod()); // 调用属性的Getter方法
|
||||
|
||||
if (property.PropertyType.IsValueType)
|
||||
{
|
||||
il.Emit(OpCodes.Box, property.PropertyType); // 值类型需要装箱
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Ret); // 返回
|
||||
|
||||
return (Func<TModel, object>)method.CreateDelegate(typeof(Func<TModel, object>));
|
||||
}
|
||||
|
||||
public void Set(TKey tEnum, object value)
|
||||
{
|
||||
if (!_setterCache.TryGetValue(tEnum, out var setter))
|
||||
@@ -89,7 +43,6 @@ namespace Net462DllTest.Utils
|
||||
if (property == null)
|
||||
{
|
||||
_setterCache[tEnum] = (s, o) => throw new ArgumentException($"没有对应的Model属性{{{tEnum}");
|
||||
//throw new ArgumentException($"Property not found for {plcVarEnum}");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -141,5 +94,67 @@ namespace Net462DllTest.Utils
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 动态创建调用Setter方法
|
||||
private Action<TModel, object> CreateSetter(PropertyInfo property)
|
||||
{
|
||||
var method = new DynamicMethod("Set" + property.Name, null, new[] { typeof(TModel), typeof(object) }, true);
|
||||
var il = method.GetILGenerator();
|
||||
|
||||
il.Emit(OpCodes.Ldarg_0); // 加载实例(PlcVarValue)
|
||||
il.Emit(OpCodes.Ldarg_1); // 加载值(object)
|
||||
|
||||
if (property.PropertyType.IsValueType)
|
||||
{
|
||||
il.Emit(OpCodes.Unbox_Any, property.PropertyType); // 解箱并转换为值类型
|
||||
}
|
||||
else
|
||||
{
|
||||
il.Emit(OpCodes.Castclass, property.PropertyType); // 引用类型转换
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Callvirt, property.GetSetMethod()); // 调用属性的Setter方法
|
||||
il.Emit(OpCodes.Ret); // 返回
|
||||
|
||||
|
||||
|
||||
return (Action<TModel, object>)method.CreateDelegate(typeof(Action<TModel, object>));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 动态创建调用Getter方法
|
||||
/// </summary>
|
||||
/// <param name="property"></param>
|
||||
/// <returns></returns>
|
||||
private Func<TModel, object> CreateGetter(PropertyInfo property)
|
||||
{
|
||||
var method = new DynamicMethod("Get" + property.Name, typeof(object), new[] { typeof(TModel) }, true);
|
||||
var il = method.GetILGenerator();
|
||||
|
||||
il.Emit(OpCodes.Ldarg_0); // 加载实例(PlcVarValue)
|
||||
il.Emit(OpCodes.Callvirt, property.GetGetMethod()); // 调用属性的Getter方法
|
||||
|
||||
if (property.PropertyType.IsValueType)
|
||||
{
|
||||
il.Emit(OpCodes.Box, property.PropertyType); // 值类型需要装箱
|
||||
}
|
||||
|
||||
il.Emit(OpCodes.Ret); // 返回
|
||||
|
||||
return (Func<TModel, object>)method.CreateDelegate(typeof(Func<TModel, object>));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user