From acea7b2e728787a0d83bbf83c8c1f042d2c32e7e Mon Sep 17 00:00:00 2001 From: chai <215380520@qq.com> Date: Mon, 3 Jun 2024 10:15:45 +0800 Subject: + plugins project --- .../MonoGame.Extended.Tweening/TweenFieldMember.cs | 44 ++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 Plugins/MonoGame.Extended/source/MonoGame.Extended.Tweening/TweenFieldMember.cs (limited to 'Plugins/MonoGame.Extended/source/MonoGame.Extended.Tweening/TweenFieldMember.cs') diff --git a/Plugins/MonoGame.Extended/source/MonoGame.Extended.Tweening/TweenFieldMember.cs b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Tweening/TweenFieldMember.cs new file mode 100644 index 0000000..da2f75d --- /dev/null +++ b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Tweening/TweenFieldMember.cs @@ -0,0 +1,44 @@ +using System; +using System.Diagnostics; +using System.Linq.Expressions; +using System.Reflection; + +namespace MonoGame.Extended.Tweening +{ + public sealed class TweenFieldMember : TweenMember + where T : struct + { + private readonly FieldInfo _fieldInfo; + + public TweenFieldMember(object target, FieldInfo fieldInfo) + : base(target, CompileGetMethod(fieldInfo), CompileSetMethod(fieldInfo)) + { + _fieldInfo = fieldInfo; + } + + private static Func CompileGetMethod(FieldInfo fieldInfo) + { + var self = Expression.Parameter(typeof(object)); + var instance = Expression.Convert(self, fieldInfo.DeclaringType); + var field = Expression.Field(instance, fieldInfo); + var convert = Expression.TypeAs(field, typeof(object)); + + return Expression.Lambda>(convert, self).Compile(); + } + + private static Action CompileSetMethod(FieldInfo fieldInfo) + { + Debug.Assert(fieldInfo.DeclaringType != null); + + var self = Expression.Parameter(typeof(object)); + var value = Expression.Parameter(typeof(object)); + var fieldExp = Expression.Field(Expression.Convert(self, fieldInfo.DeclaringType), fieldInfo); + var assignExp = Expression.Assign(fieldExp, Expression.Convert(value, fieldInfo.FieldType)); + + return Expression.Lambda>(assignExp, self, value).Compile(); + } + + public override Type Type => _fieldInfo.FieldType; + public override string Name => _fieldInfo.Name; + } +} \ No newline at end of file -- cgit v1.1-26-g67d0