HTMLBridge を介してマネージ コード内のメソッドに JavaScript 配列とディクショナリ型オブジェクトを渡すのに問題があります。このトピックの詳細を説明したマイクロソフトの記事やネット上の情報は、私をどこにも導きませんでした。
リンクされた記事の次の情報を使用します。
オブジェクトとして型指定された NET Framework プロパティまたは入力パラメーターは、ターゲットの .NET Framework プロパティまたは入力パラメーターに値でマーシャリングするときに、次のヒューリスティックを使用して変換されます。
JavaScript 配列は に変換され
object[]
ます。JavaScript 辞書は に変換され
Dictionary<string,object>
ます。
...いくつかの方法で配列とディクショナリ オブジェクトをマネージド コードに渡そうとしましたが、成功しませんでした。
Javascript:
var array = [{key: 1}, {key: 2}, {key: 3}];
silverlight_domElement.content.testObject.testMethod(array);
C# (試行 #1):
[ScriptableMember]
//THROWS CONVERSION EXCEPTION HERE
public void testMethod(Dictionary<string,object>[] arrayParam)
{
//...
}
C# (試行 #2):
[ScriptableMember]
public void testMethod(object arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr = (Dictionary<string, object>[])arrayParam;
}
C# (試行 #3):
[ScriptableMember]
public void testMethod(ScriptObject arrayParam)
{
//THROWS CONVERSION EXCEPTION HERE
Dictionary<string, object>[] arr =
arrayParam.ConvertTo<Dictionary<string, object>[]>();
}
例外の形式は次のとおりです(「TARGET TYPE」は、明示的または暗黙的なキャスト (を含むObject[]
)の結果として期待されるオブジェクトの型です。
SCRIPT16389: System.ArgumentException: このオブジェクトは、指定されたタイプTARGET TYPEに変換できません。パラメータ名: targetType
System.Windows.Browser.ScriptObject.ConvertTo (type targetType、ブール型 allowSerialization) で
System.Windows.Hosting.ScriptingInterface.GetScriptParamValueForType (ScriptParam scriptParam、desiredType の種類) で
System.Windows.Hosting.ScriptingInterface.ConvertFromScriptParams (ParameterInfo[] パラメーター、ScriptParam[] 引数) で
System.Windows.Browser.ManagedObjectInfo.ScriptMethod.Invoke (ManagedObject obj、InvokeType invokeType、ScriptParam[] args) で
System.Windows.Browser.ManagedObjectInfo.Invoke (ManagedObject obj、InvokeType invokeType、文字列 memberName、ScriptParam[] args) で
System.Windows.Hosting.ManagedHost.InvokeScriptableMember (IntPtr pHandle、Int32 nMemberID、Int32 nInvokeType、Int32 nArgCount、ScriptParam[] pArgs、ScriptParam& pResult、ExceptionInfo& pExcepInfo) で
(辞書オブジェクトを C# に as として渡すための同様の試みが行われましたDictionary<string, object>
)。
これらの試みは、前述の記事以降の情報の誤解の結果ですか? または、私の実装は単に間違っていますか?
補遺:
私はScriptObject.getProperty()
で私が望むことを達成する方法を認識していますが、可能であれば具体的で正確な型を扱いたいと思っています。キー付きの値が前の 2 つのいずれかとしてボックス化解除できない場合、ネイティブ型、String、または ScriptObject のいずれかを返すという事実は言うまでもありません。ネイティブ型にたどり着くまで、任意にネストされたオブジェクトで繰り返し呼び出すようになるのは嫌です。