CSharpInvokeMemberBinder
using System;
using System.Collections.Generic;
using System.Dynamic;
namespace Microsoft.CSharp.RuntimeBinder
{
internal sealed class CSharpInvokeMemberBinder : InvokeMemberBinder, ICSharpInvokeOrInvokeMemberBinder
{
private CSharpCallFlags _flags;
private Type _callingContext;
private List<Type> _typeArguments;
private List<CSharpArgumentInfo> _argumentInfo;
private RuntimeBinder _binder;
bool ICSharpInvokeOrInvokeMemberBinder.StaticCall {
get {
if (_argumentInfo[0] != null)
return _argumentInfo[0].IsStaticType;
return false;
}
}
CSharpCallFlags ICSharpInvokeOrInvokeMemberBinder.Flags {
get {
return _flags;
}
}
Type ICSharpInvokeOrInvokeMemberBinder.CallingContext {
get {
return _callingContext;
}
}
IList<Type> ICSharpInvokeOrInvokeMemberBinder.TypeArguments {
get {
return _typeArguments.AsReadOnly();
}
}
IList<CSharpArgumentInfo> ICSharpInvokeOrInvokeMemberBinder.ArgumentInfo {
get {
return _argumentInfo.AsReadOnly();
}
}
bool ICSharpInvokeOrInvokeMemberBinder.ResultDiscarded {
get {
return (_flags & CSharpCallFlags.ResultDiscarded) != CSharpCallFlags.None;
}
}
public CSharpInvokeMemberBinder(CSharpCallFlags flags, string name, Type callingContext, IEnumerable<Type> typeArguments, IEnumerable<CSharpArgumentInfo> argumentInfo)
: base(name, false, BinderHelper.CreateCallInfo(argumentInfo, 1))
{
_flags = flags;
_callingContext = callingContext;
_typeArguments = BinderHelper.ToList(typeArguments);
_argumentInfo = BinderHelper.ToList(argumentInfo);
_binder = RuntimeBinder.GetInstance();
}
public override DynamicMetaObject FallbackInvokeMember(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion)
{
return BinderHelper.Bind(this, _binder, BinderHelper.Cons(target, args), _argumentInfo, errorSuggestion);
}
public override DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion)
{
CSharpInvokeBinder cSharpInvokeBinder = new CSharpInvokeBinder(_flags, _callingContext, _argumentInfo);
return cSharpInvokeBinder.Defer(target, args);
}
string get_Name()
{
return base.Name;
}
string ICSharpInvokeOrInvokeMemberBinder.get_Name()
{
return this.get_Name();
}
}
}