CSharpGetMemberBinder
using Microsoft.CSharp.RuntimeBinder.Semantics;
using System;
using System.Collections.Generic;
using System.Dynamic;
namespace Microsoft.CSharp.RuntimeBinder
{
internal sealed class CSharpGetMemberBinder : GetMemberBinder, IInvokeOnGetBinder, ICSharpBinder
{
private readonly CSharpArgumentInfo[] _argumentInfo;
private readonly RuntimeBinder _binder;
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);
_binder = new RuntimeBinder(callingContext, false);
}
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();
}
}
}