mirror of
https://github.com/PetroProtsyk/SSharp
synced 2026-06-08 12:11:10 +00:00
154 lines
3.8 KiB
C#
154 lines
3.8 KiB
C#
/*
|
|
* Copyright © 2011, Petro Protsyk, Denys Vuika
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
using System;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using Scripting.SSharp.Runtime.Promotion;
|
|
|
|
namespace Scripting.SSharp.Runtime
|
|
{
|
|
#if !PocketPC && !SILVERLIGHT
|
|
public class ExplicitInterface : IScriptable
|
|
{
|
|
private InterfaceMapping _mapping;
|
|
private readonly object _target;
|
|
|
|
public ExplicitInterface(object target, Type interfaceType)
|
|
{
|
|
if (target == null) throw new ArgumentNullException("target");
|
|
if (interfaceType == null) throw new ArgumentNullException("interfaceType");
|
|
|
|
_mapping = target.GetType().GetInterfaceMap(interfaceType);
|
|
_target = target;
|
|
}
|
|
|
|
#region IScriptable Members
|
|
|
|
public object Instance
|
|
{
|
|
get { return _target; }
|
|
}
|
|
|
|
[PromoteAttribute(false)]
|
|
public IMemberBinding GetMember(string name, params object[] arguments)
|
|
{
|
|
IBinding getter = null;
|
|
MethodInfo getMethod = FindMethod("get_" + name);
|
|
if (getMethod != null)
|
|
getter = new DelayedMethodBinding(getMethod, _target);
|
|
|
|
IBinding setter = null;
|
|
MethodInfo setMethod = FindMethod("set_" + name);
|
|
if (setMethod != null)
|
|
setter = new DelayedMethodBinding(setMethod, _target);
|
|
|
|
return new InterfaceMember(getter, setter, _target);
|
|
}
|
|
|
|
[PromoteAttribute(false)]
|
|
public IBinding GetMethod(string name, params object[] arguments)
|
|
{
|
|
MethodInfo method = FindMethod(name);
|
|
if (method == null)
|
|
throw new ScriptMethodNotFoundException(name);
|
|
|
|
return new DelayedMethodBinding(method, _target);
|
|
}
|
|
|
|
[PromoteAttribute(false)]
|
|
private MethodInfo FindMethod(string name)
|
|
{
|
|
MethodInfo method = _mapping.InterfaceMethods.Where(i => i.Name == name).FirstOrDefault();
|
|
return method;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Interface Property Bind
|
|
private class InterfaceMember : IMemberBinding
|
|
{
|
|
private readonly IBinding _getter;
|
|
private readonly IBinding _setter;
|
|
|
|
public InterfaceMember(IBinding getter, IBinding setter, object target)
|
|
{
|
|
_getter = getter;
|
|
_setter = setter;
|
|
Target = target;
|
|
}
|
|
|
|
#region IMemberBind Members
|
|
|
|
public object Target
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
|
|
public Type TargetType
|
|
{
|
|
get { throw new NotSupportedException(); }
|
|
}
|
|
|
|
public MemberInfo Member
|
|
{
|
|
get { throw new NotSupportedException(); }
|
|
}
|
|
|
|
public void SetValue(object value)
|
|
{
|
|
if (_setter == null) throw new NotSupportedException();
|
|
_setter.Invoke(null, new[] { value });
|
|
}
|
|
|
|
public object GetValue()
|
|
{
|
|
if (_getter == null) throw new NotSupportedException();
|
|
return _getter.Invoke(null, new object[0]);
|
|
}
|
|
|
|
public void AddHandler(object value)
|
|
{
|
|
throw new NotSupportedException();
|
|
}
|
|
|
|
public void RemoveHandler(object value)
|
|
{
|
|
throw new NotSupportedException();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region IInvokable Members
|
|
|
|
public bool CanInvoke()
|
|
{
|
|
return _getter != null;
|
|
}
|
|
|
|
public object Invoke(IScriptContext context, object[] args)
|
|
{
|
|
return GetValue();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
#endregion
|
|
}
|
|
#endif
|
|
}
|