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 --- .../TweenPropertyMember.cs | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Plugins/MonoGame.Extended/source/MonoGame.Extended.Tweening/TweenPropertyMember.cs (limited to 'Plugins/MonoGame.Extended/source/MonoGame.Extended.Tweening/TweenPropertyMember.cs') diff --git a/Plugins/MonoGame.Extended/source/MonoGame.Extended.Tweening/TweenPropertyMember.cs b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Tweening/TweenPropertyMember.cs new file mode 100644 index 0000000..7b1db71 --- /dev/null +++ b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Tweening/TweenPropertyMember.cs @@ -0,0 +1,43 @@ +using System; +using System.Diagnostics; +using System.Linq.Expressions; +using System.Reflection; + +namespace MonoGame.Extended.Tweening +{ + public sealed class TweenPropertyMember : TweenMember + where T : struct + { + private readonly PropertyInfo _propertyInfo; + + public TweenPropertyMember(object target, PropertyInfo propertyInfo) + : base(target, CompileGetMethod(propertyInfo), CompileSetMethod(propertyInfo)) + { + _propertyInfo = propertyInfo; + } + + public override Type Type => _propertyInfo.PropertyType; + public override string Name => _propertyInfo.Name; + + private static Func CompileGetMethod(PropertyInfo propertyInfo) + { + var param = Expression.Parameter(typeof(object)); + var instance = Expression.Convert(param, propertyInfo.DeclaringType); + var convert = Expression.TypeAs(Expression.Property(instance, propertyInfo), typeof(object)); + return Expression.Lambda>(convert, param).Compile(); + } + + private static Action CompileSetMethod(PropertyInfo propertyInfo) + { + Debug.Assert(propertyInfo.DeclaringType != null); + + var param = Expression.Parameter(typeof(object)); + var argument = Expression.Parameter(typeof(object)); + var expression = Expression.Convert(param, propertyInfo.DeclaringType); + var methodInfo = propertyInfo.SetMethod; + var arguments = Expression.Convert(argument, propertyInfo.PropertyType); + var setterCall = Expression.Call(expression, methodInfo, arguments); + return Expression.Lambda>(setterCall, param, argument).Compile(); + } + } +} \ No newline at end of file -- cgit v1.1-26-g67d0