[英]Exposing c# anonymous class objects to COM (JavaScript)
.NET 4.5+中是否有類/ API允許將C#匿名類的實例公開為COM的后期綁定對象? 我想這樣做:
webBrowser.Document.InvokeScript("TestMethod", new object[] {
new {
helloProperty = "Hello!",
byeProperty = "Bye!"
}
});
並在JavaScript中使用它:
function TestMethod(obj)
{
alert(obj.helloProperty + ", " + obj.byeProperty);
}
創建一個幫助器類來包裝匿名對象並通過IReflect公開它的屬性應該不是問題,但也許這樣的東西已經存在了? 只是不想重新發明輪子。
基於這篇優秀的博客文章 ,我已經制作了一個輔助課程來實現它。
用法:
webBrowser.Document.InvokeScript("TestMethod", new object[] {
new Reflector(new { helloProperty = "Hello!", byeProperty = "Bye!" }) });
碼:
[ComVisible(true), ClassInterface(ClassInterfaceType.None)]
public class Reflector :
System.Reflection.IReflect
{
object _target;
protected Reflector() { }
public Reflector(object target)
{
Debug.Assert(target != null);
_target = target;
}
public object Target
{
get { return _target; }
}
#region IReflect
public FieldInfo GetField(string name, BindingFlags bindingAttr)
{
return this._target.GetType().GetField(name, bindingAttr);
}
public FieldInfo[] GetFields(BindingFlags bindingAttr)
{
return this._target.GetType().GetFields(bindingAttr);
}
public MemberInfo[] GetMember(string name, BindingFlags bindingAttr)
{
return this._target.GetType().GetMember(name, bindingAttr);
}
public MemberInfo[] GetMembers(BindingFlags bindingAttr)
{
return this._target.GetType().GetMembers(bindingAttr);
}
public MethodInfo GetMethod(string name, BindingFlags bindingAttr)
{
return this._target.GetType().GetMethod(name, bindingAttr);
}
public MethodInfo GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers)
{
return this._target.GetType().GetMethod(name, bindingAttr, binder, types, modifiers);
}
public MethodInfo[] GetMethods(BindingFlags bindingAttr)
{
return this._target.GetType().GetMethods(bindingAttr);
}
public PropertyInfo[] GetProperties(BindingFlags bindingAttr)
{
return _target.GetType().GetProperties(bindingAttr);
}
public PropertyInfo GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
{
return this._target.GetType().GetProperty(name, bindingAttr, binder, returnType, types, modifiers);
}
public PropertyInfo GetProperty(string name, BindingFlags bindingAttr)
{
return this._target.GetType().GetProperty(name, bindingAttr);
}
public object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters)
{
if (target == this)
{
if (name.CompareTo("[DISPID=0]") == 0)
{
if (invokeAttr.HasFlag(BindingFlags.InvokeMethod))
return this._target;
else if (invokeAttr.HasFlag(BindingFlags.GetProperty) && args.Length == 0)
return this._target.ToString();
}
else
{
return this._target.GetType().InvokeMember(name, invokeAttr, binder, _target, args, modifiers, culture, namedParameters);
}
}
throw new ArgumentException();
}
public Type UnderlyingSystemType
{
get { return this._target.GetType().UnderlyingSystemType; }
}
#endregion
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.