0

汎用デリゲートから名前付きデリゲートに変換しようとしています。

結果は次のようになります (有効な C# ではありません)。

Action<CustomClass> act = ???;
CustomDelegate d = act;

私が試してみました

CustomDelegate d = act.Invoke;
CustomDelegate d = new CustomDelegate( act );
CustomDelegate d = new CustomDelegate( x => act(x) );
CustomDelegate d = new CustomDelegate( act.Invoke );

これらはすべて実行時に失敗しArgumentException、エラーが発生します

インスタンス メソッドへのデリゲートは、null の 'this' を持つことはできません。

私のコードではないスタックのトップは次のとおりです。

System.MulticastDelegate.ThrowNullThisInDelegateToInstance() で

System.MulticastDelegate.CtorClosed (オブジェクト ターゲット、IntPtr methodPtr) で

例外が発生しないようにデリゲートを変換するにはどうすればよいですか?

4

1 に答える 1

3

最終的に、デリゲートのキャストに関する質問に対する @DiegoMijelshon のソリューションを試して、答えを見つけました。NullReferenceExceptionその解決策で、の代わりにを取得しましたArgumentException。したがって、問題は、私が持っていた Action<> が null (パラメーターであった) ためであることがわかりました。したがって、次のようなヌルチェックで問題が解決しました。

CustomDelegate d = adt == null ? null : act.Invoke;
// Though, I actually went with @DiegoMijelshon solution to avoid extra indirection.

次に、リフレクターを調べて(もっと早く行うべきでした)、実際に呼び出されるパラメーターのnullチェックであることがわかりましたThrowNullThisInDelegateToInstance

于 2012-11-05T22:19:31.953 に答える