CSharpGetMemberBinder
using Microsoft.CSharp.RuntimeBinder.Semantics;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Numerics.Hashing;
namespace Microsoft.CSharp.RuntimeBinder
{
internal sealed class CSharpGetMemberBinder : GetMemberBinder, IInvokeOnGetBinder, ICSharpBinder
{
private readonly CSharpArgumentInfo[] _argumentInfo;
private readonly RuntimeBinder _binder;
private readonly Type _callingContext;
public BindingFlag BindingFlags => BindingFlag.BIND_RVALUEREQUIRED;
public bool IsBinderThatCanHaveRefReceiver => false;
bool IInvokeOnGetBinder.InvokeOnGet {
get {
return !ResultIndexed;
}
}
private bool ResultIndexed { get; }
public Expr DispatchPayload(RuntimeBinder runtimeBinder, ArgumentObject[] arguments, LocalVariableSymbol[] locals)
{
return runtimeBinder.BindProperty(this, arguments[0], locals[0], null);
}
public void PopulateSymbolTableWithName(Type callingType, ArgumentObject[] arguments)
{
SymbolTable.PopulateSymbolTableWithName(base.Name, null, arguments[0].Type);
}
CSharpArgumentInfo ICSharpBinder.GetArgumentInfo(int index)
{
return _argumentInfo[index];
}
public CSharpGetMemberBinder(string name, bool resultIndexed, Type callingContext, IEnumerable<CSharpArgumentInfo> argumentInfo)
: base(name, false)
{
ResultIndexed = resultIndexed;
_argumentInfo = BinderHelper.ToArray(argumentInfo);
_callingContext = callingContext;
_binder = new RuntimeBinder(callingContext, false);
}
public int GetGetBinderEquivalenceHash()
{
int h = _callingContext?.GetHashCode() ?? 0;
if (ResultIndexed)
h = HashHelpers.Combine(h, 1);
h = HashHelpers.Combine(h, base.Name.GetHashCode());
return BinderHelper.AddArgHashes(h, _argumentInfo);
}
public bool IsEquivalentTo(ICSharpBinder other)
{
CSharpGetMemberBinder cSharpGetMemberBinder = other as CSharpGetMemberBinder;
if (cSharpGetMemberBinder == null)
return false;
if (base.Name != cSharpGetMemberBinder.Name || ResultIndexed != cSharpGetMemberBinder.ResultIndexed || _callingContext != cSharpGetMemberBinder._callingContext || _argumentInfo.Length != cSharpGetMemberBinder._argumentInfo.Length)
return false;
return BinderHelper.CompareArgInfos(_argumentInfo, cSharpGetMemberBinder._argumentInfo);
}
public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
{
BinderHelper.ValidateBindArgument(target, "target");
return BinderHelper.Bind(this, _binder, new DynamicMetaObject[1] {
target
}, _argumentInfo, errorSuggestion);
}
string get_Name()
{
return base.Name;
}
string ICSharpBinder.get_Name()
{
return this.get_Name();
}
}
}