|
@@ -12,15 +12,22 @@ namespace Jint.Runtime.Interop
|
|
/// </summary>
|
|
/// </summary>
|
|
public sealed class TypeResolver
|
|
public sealed class TypeResolver
|
|
{
|
|
{
|
|
- public static readonly TypeResolver Default = new TypeResolver();
|
|
|
|
|
|
+ public static readonly TypeResolver Default = new();
|
|
|
|
|
|
private Dictionary<ClrPropertyDescriptorFactoriesKey, ReflectionAccessor> _reflectionAccessors = new();
|
|
private Dictionary<ClrPropertyDescriptorFactoriesKey, ReflectionAccessor> _reflectionAccessors = new();
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Registers a filter that determines whether given member is wrapped to interop or returned as undefined.
|
|
/// Registers a filter that determines whether given member is wrapped to interop or returned as undefined.
|
|
|
|
+ /// By default allows all but will also be limited by <see cref="InteropOptions.AllowGetType"/> configuration.
|
|
/// </summary>
|
|
/// </summary>
|
|
|
|
+ /// <seealso cref="InteropOptions.AllowGetType"/>
|
|
public Predicate<MemberInfo> MemberFilter { get; set; } = _ => true;
|
|
public Predicate<MemberInfo> MemberFilter { get; set; } = _ => true;
|
|
|
|
|
|
|
|
+ internal bool Filter(Engine engine, MemberInfo m)
|
|
|
|
+ {
|
|
|
|
+ return (engine.Options.Interop.AllowGetType || m.Name != nameof(GetType)) && MemberFilter(m);
|
|
|
|
+ }
|
|
|
|
+
|
|
/// <summary>
|
|
/// <summary>
|
|
/// Gives the exposed names for a member. Allows to expose C# convention following member like IsSelected
|
|
/// Gives the exposed names for a member. Allows to expose C# convention following member like IsSelected
|
|
/// as more JS idiomatic "selected" for example. Defaults to returning the <see cref="MemberInfo.Name"/> as-is.
|
|
/// as more JS idiomatic "selected" for example. Defaults to returning the <see cref="MemberInfo.Name"/> as-is.
|
|
@@ -73,7 +80,7 @@ namespace Jint.Runtime.Interop
|
|
const BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public;
|
|
const BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public;
|
|
|
|
|
|
// properties and fields cannot be numbers
|
|
// properties and fields cannot be numbers
|
|
- if (!isNumber && TryFindMemberAccessor(type, memberName, bindingFlags, indexer, out var temp))
|
|
|
|
|
|
+ if (!isNumber && TryFindMemberAccessor(engine, type, memberName, bindingFlags, indexer, out var temp))
|
|
{
|
|
{
|
|
return temp;
|
|
return temp;
|
|
}
|
|
}
|
|
@@ -97,7 +104,7 @@ namespace Jint.Runtime.Interop
|
|
{
|
|
{
|
|
foreach (var iprop in iface.GetProperties())
|
|
foreach (var iprop in iface.GetProperties())
|
|
{
|
|
{
|
|
- if (!MemberFilter(iprop))
|
|
|
|
|
|
+ if (!Filter(engine, iprop))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -130,7 +137,7 @@ namespace Jint.Runtime.Interop
|
|
{
|
|
{
|
|
foreach (var imethod in iface.GetMethods())
|
|
foreach (var imethod in iface.GetMethods())
|
|
{
|
|
{
|
|
- if (!MemberFilter(imethod))
|
|
|
|
|
|
+ if (!Filter(engine, imethod))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -165,7 +172,7 @@ namespace Jint.Runtime.Interop
|
|
var matches = new List<MethodInfo>();
|
|
var matches = new List<MethodInfo>();
|
|
foreach (var method in extensionMethods)
|
|
foreach (var method in extensionMethods)
|
|
{
|
|
{
|
|
- if (!MemberFilter(method))
|
|
|
|
|
|
+ if (!Filter(engine, method))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -189,6 +196,7 @@ namespace Jint.Runtime.Interop
|
|
}
|
|
}
|
|
|
|
|
|
internal bool TryFindMemberAccessor(
|
|
internal bool TryFindMemberAccessor(
|
|
|
|
+ Engine engine,
|
|
Type type,
|
|
Type type,
|
|
string memberName,
|
|
string memberName,
|
|
BindingFlags bindingFlags,
|
|
BindingFlags bindingFlags,
|
|
@@ -201,7 +209,7 @@ namespace Jint.Runtime.Interop
|
|
var typeResolverMemberNameCreator = MemberNameCreator;
|
|
var typeResolverMemberNameCreator = MemberNameCreator;
|
|
foreach (var p in type.GetProperties(bindingFlags))
|
|
foreach (var p in type.GetProperties(bindingFlags))
|
|
{
|
|
{
|
|
- if (!MemberFilter(p))
|
|
|
|
|
|
+ if (!Filter(engine, p))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -231,7 +239,7 @@ namespace Jint.Runtime.Interop
|
|
FieldInfo field = null;
|
|
FieldInfo field = null;
|
|
foreach (var f in type.GetFields(bindingFlags))
|
|
foreach (var f in type.GetFields(bindingFlags))
|
|
{
|
|
{
|
|
- if (!MemberFilter(f))
|
|
|
|
|
|
+ if (!Filter(engine, f))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -256,7 +264,7 @@ namespace Jint.Runtime.Interop
|
|
List<MethodInfo> methods = null;
|
|
List<MethodInfo> methods = null;
|
|
foreach (var m in type.GetMethods(bindingFlags))
|
|
foreach (var m in type.GetMethods(bindingFlags))
|
|
{
|
|
{
|
|
- if (!MemberFilter(m))
|
|
|
|
|
|
+ if (!Filter(engine, m))
|
|
{
|
|
{
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|