rabidus-test/Assets/Plugins/QFSW/Quantum Console/Source/Scripts/Internal/FieldDelegateMethod.cs

58 lines
2.3 KiB
C#
Raw Normal View History

2023-08-22 15:41:12 +03:00
using QFSW.QC.Utilities;
using System;
using System.Globalization;
using System.Reflection;
namespace QFSW.QC.Internal
{
internal class FieldDelegateMethod : FieldMethod
{
public FieldDelegateMethod(FieldInfo fieldInfo) : base(fieldInfo)
{
if (!_fieldInfo.IsStrongDelegate())
{
throw new ArgumentException("Invalid delegate type.", nameof(fieldInfo));
}
if (_fieldInfo.IsStatic)
{
_internalDelegate = (Func<FieldInfo, object[], object>)StaticInvoker;
}
else
{
_internalDelegate = (Func<object, FieldInfo, object[], object>)NonStaticInvoker;
}
_parameters = _fieldInfo.FieldType.GetMethod("Invoke").GetParameters();
for (int i = 0; i < _parameters.Length; i++)
{
_parameters[i] = new CustomParameter(_parameters[i], $"arg{i}");
}
}
public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture)
{
object[] realParameters = new object[_internalDelegate.Method.GetParameters().Length];
if (realParameters.Length < 2) { throw new Exception("FieldDelegateMethod's internal delegate must contain at least two paramaters."); }
if (!IsStatic) { realParameters[0] = obj; }
realParameters[realParameters.Length - 2] = _fieldInfo;
realParameters[realParameters.Length - 1] = parameters;
return _internalDelegate.DynamicInvoke(realParameters);
}
private static object StaticInvoker(FieldInfo field, params object[] args)
{
Delegate del = (Delegate)field.GetValue(null);
if (del != null) { return del.DynamicInvoke(args); }
else { throw new Exception("Delegate was invalid and could not be invoked."); }
}
private object NonStaticInvoker(object obj, FieldInfo field, params object[] args)
{
Delegate del = (Delegate)field.GetValue(obj);
if (del != null) { return del.DynamicInvoke(args); }
else { throw new Exception("Delegate was invalid and could not be invoked."); }
}
}
}