Init
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
|
||||
namespace QFSW.QC.Internal
|
||||
{
|
||||
internal class CustomParameter : ParameterInfo
|
||||
{
|
||||
private readonly ParameterInfo _internalParameter;
|
||||
private readonly Type _typeOverride;
|
||||
private readonly string _nameOverride;
|
||||
|
||||
public CustomParameter(ParameterInfo internalParameter, Type typeOverride, string nameOverride)
|
||||
{
|
||||
_typeOverride = typeOverride;
|
||||
_nameOverride = nameOverride;
|
||||
_internalParameter = internalParameter;
|
||||
}
|
||||
|
||||
public CustomParameter(ParameterInfo internalParameter, string nameOverride) : this(internalParameter, internalParameter.ParameterType, nameOverride) { }
|
||||
|
||||
public override Type ParameterType => _typeOverride;
|
||||
public override string Name => _nameOverride;
|
||||
|
||||
public override ParameterAttributes Attributes => _internalParameter.Attributes;
|
||||
public override object DefaultValue => _internalParameter.DefaultValue;
|
||||
public override bool Equals(object obj) { return _internalParameter.Equals(obj); }
|
||||
public override IEnumerable<CustomAttributeData> CustomAttributes => _internalParameter.CustomAttributes;
|
||||
public override object[] GetCustomAttributes(bool inherit) { return _internalParameter.GetCustomAttributes(inherit); }
|
||||
public override object[] GetCustomAttributes(Type attributeType, bool inherit) { return _internalParameter.GetCustomAttributes(attributeType, inherit); }
|
||||
public override IList<CustomAttributeData> GetCustomAttributesData() { return _internalParameter.GetCustomAttributesData(); }
|
||||
public override int GetHashCode() { return _internalParameter.GetHashCode(); }
|
||||
public override Type[] GetOptionalCustomModifiers() { return _internalParameter.GetOptionalCustomModifiers(); }
|
||||
public override Type[] GetRequiredCustomModifiers() { return _internalParameter.GetRequiredCustomModifiers(); }
|
||||
public override bool HasDefaultValue => _internalParameter.HasDefaultValue;
|
||||
public override bool IsDefined(Type attributeType, bool inherit) { return _internalParameter.IsDefined(attributeType, inherit); }
|
||||
public override MemberInfo Member => _internalParameter.Member;
|
||||
public override int MetadataToken => _internalParameter.MetadataToken;
|
||||
public override int Position => _internalParameter.Position;
|
||||
public override object RawDefaultValue => _internalParameter.RawDefaultValue;
|
||||
public override string ToString() { return _internalParameter.ToString(); }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9e07451b78498b4408061ec6a2cc95dd
|
||||
timeCreated: 1543091613
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,44 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
|
||||
namespace QFSW.QC.Internal
|
||||
{
|
||||
internal class DummyParameter : ParameterInfo
|
||||
{
|
||||
private readonly ParameterInfo _internalDummy;
|
||||
|
||||
public DummyParameter(Type type, string name, int position)
|
||||
{
|
||||
ParameterType = type;
|
||||
Name = name;
|
||||
Position = position;
|
||||
|
||||
MethodInfo dummyMethod = typeof(DummyParameter).GetMethod(nameof(DummyMethod), BindingFlags.NonPublic | BindingFlags.Static);
|
||||
_internalDummy = dummyMethod.GetParameters()[0];
|
||||
}
|
||||
|
||||
private static void DummyMethod(int dummyParameter) { }
|
||||
|
||||
public override Type ParameterType { get; }
|
||||
public override string Name { get; }
|
||||
public override int Position { get; }
|
||||
|
||||
public override ParameterAttributes Attributes => _internalDummy.Attributes;
|
||||
public override object DefaultValue => null;
|
||||
public override bool Equals(object obj) { return ReferenceEquals(this, obj); }
|
||||
public override IEnumerable<CustomAttributeData> CustomAttributes => _internalDummy.CustomAttributes;
|
||||
public override object[] GetCustomAttributes(bool inherit) => _internalDummy.GetCustomAttributes(inherit);
|
||||
public override object[] GetCustomAttributes(Type attributeType, bool inherit) => _internalDummy.GetCustomAttributes(attributeType, inherit);
|
||||
public override IList<CustomAttributeData> GetCustomAttributesData() => _internalDummy.GetCustomAttributesData();
|
||||
public override int GetHashCode() { return 0; }
|
||||
public override Type[] GetOptionalCustomModifiers() { return _internalDummy.GetOptionalCustomModifiers(); }
|
||||
public override Type[] GetRequiredCustomModifiers() { return _internalDummy.GetRequiredCustomModifiers(); }
|
||||
public override bool HasDefaultValue => false;
|
||||
public override bool IsDefined(Type attributeType, bool inherit) { return false; }
|
||||
public override MemberInfo Member => _internalDummy.Member;
|
||||
public override int MetadataToken => _internalDummy.MetadataToken;
|
||||
public override object RawDefaultValue => null;
|
||||
public override string ToString() { return Name; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e8b234cac26fbfc4a8abf07467433e81
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
namespace QFSW.QC.Internal
|
||||
{
|
||||
internal class FieldAutoMethod : FieldMethod
|
||||
{
|
||||
public enum AccessType
|
||||
{
|
||||
Read = 0,
|
||||
Write = 1
|
||||
}
|
||||
|
||||
private readonly AccessType _accessType;
|
||||
|
||||
public FieldAutoMethod(FieldInfo fieldInfo, AccessType accessType) : base(fieldInfo)
|
||||
{
|
||||
_accessType = accessType;
|
||||
if (_accessType == AccessType.Read)
|
||||
{
|
||||
_internalDelegate = _fieldInfo.IsStatic
|
||||
? (Func<FieldInfo, object>)_StaticReader
|
||||
: (Func<object, object>)_fieldInfo.GetValue;
|
||||
|
||||
_parameters = Array.Empty<ParameterInfo>();
|
||||
}
|
||||
else
|
||||
{
|
||||
_internalDelegate = _fieldInfo.IsStatic
|
||||
? (Action<FieldInfo, object>)_StaticWriter
|
||||
: (Action<object, object>)_fieldInfo.SetValue;
|
||||
|
||||
_parameters = new ParameterInfo[] { new CustomParameter(_internalDelegate.Method.GetParameters()[1], _fieldInfo.FieldType, "value") };
|
||||
}
|
||||
}
|
||||
|
||||
private static object _StaticReader(FieldInfo field) { return field.GetValue(null); }
|
||||
private static void _StaticWriter(FieldInfo field, object value) { field.SetValue(null, value); }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4817e6908a5c544ab88c69cd27c68a41
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,57 @@
|
||||
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."); }
|
||||
}
|
||||
}
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b9425c6d4746d884f9a82b6a9ba522f7
|
||||
timeCreated: 1543091933
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace QFSW.QC.Internal
|
||||
{
|
||||
internal abstract class FieldMethod : MethodInfo
|
||||
{
|
||||
protected readonly FieldInfo _fieldInfo;
|
||||
protected Delegate _internalDelegate;
|
||||
protected ParameterInfo[] _parameters;
|
||||
|
||||
protected FieldMethod(FieldInfo fieldInfo) { _fieldInfo = fieldInfo; }
|
||||
|
||||
public override object Invoke(object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture)
|
||||
{
|
||||
object[] realParameters = new object[parameters.Length + 1];
|
||||
realParameters[0] = IsStatic ? _fieldInfo : obj;
|
||||
|
||||
Array.Copy(parameters, 0, realParameters, 1, parameters.Length);
|
||||
return _internalDelegate.DynamicInvoke(realParameters);
|
||||
}
|
||||
|
||||
public override ParameterInfo[] GetParameters()
|
||||
{
|
||||
return _parameters;
|
||||
}
|
||||
|
||||
public override string Name => _fieldInfo.Name;
|
||||
public override Type DeclaringType => _fieldInfo.DeclaringType;
|
||||
public override Type ReflectedType => _fieldInfo.ReflectedType;
|
||||
public override object[] GetCustomAttributes(bool inherit) { return _fieldInfo.GetCustomAttributes(inherit); }
|
||||
public override object[] GetCustomAttributes(Type attributeType, bool inherit) { return _fieldInfo.GetCustomAttributes(attributeType, inherit); }
|
||||
|
||||
public override MethodAttributes Attributes => _internalDelegate.Method.Attributes;
|
||||
public override RuntimeMethodHandle MethodHandle => _internalDelegate.Method.MethodHandle;
|
||||
public override ICustomAttributeProvider ReturnTypeCustomAttributes => _internalDelegate.Method.ReturnTypeCustomAttributes;
|
||||
public override MethodInfo GetBaseDefinition() { return _internalDelegate.Method.GetBaseDefinition(); }
|
||||
public override MethodImplAttributes GetMethodImplementationFlags() { return _internalDelegate.Method.GetMethodImplementationFlags(); }
|
||||
public override bool IsDefined(Type attributeType, bool inherit) { return _internalDelegate.Method.IsDefined(attributeType, inherit); }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bc3a8d5d7bf0b284fb3e38019fb1c469
|
||||
timeCreated: 1543091424
|
||||
licenseType: Store
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user