質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2575閲覧

サブクラスに対し、[OnSerializing]属性を持ったメソッドを持つことを強制したい

oriduru

総合スコア36

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2016/06/30 02:05

編集2016/06/30 02:12

###前提・実現したいこと
サブクラスに対して、[OnSerializing]属性を持ったメソッドを持つことを強制したいです。

###発生している問題・エラーメッセージ
スーパークラスに、抽象メソッドOnSerializing()を作成しました。
これにより期待通り、サブクラスはOnSerializing()の実装を強制されます。
しかし、実際にHTTP通信を行うと、以下のエラーが発生します。

型 'BaseRequest' の仮想メソッド 'Void OnSerializing(System.Runtime.Serialization.StreamingContext)' に 'System.Runtime.Serialization.OnSerializingAttribute' 属性を設定できません。

###該当のソースコード

C#

1[OnSerializing] 2public abstract void OnSerializing(StreamingContext sc);

###試したこと
・スーパークラスにのみ[OnSerializing]属性を付加しました。
→上記のエラーが発生しました。
・サブクラスにのみ[OnSerializing]属性を付加しました。
→サブクラス側で上記と同じエラーが発生しました。
・スーパークラスとサブクラスの両方に[OnSerializing]属性を付加しました。
→上記のエラーが発生しました。

###補足情報(言語/FW/ツール等のバージョンなど)
C#(.NET Framework4.5.1)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

実装させるメソッドには属性を付けず、
親に属性をつけた別のメソッドを作り、
そいつから実装させるメソッドを呼ぶようにしてみました。

C#

1[TestMethod] 2public void TestMethod1() 3{ 4 var stream = Console.OpenStandardOutput(); 5 6 var formatter = new BinaryFormatter(); 7 8 var obj = new Hoge(); 9 10 formatter.Serialize(stream,obj); // HogeHoge 11 12} 13 14[Serializable] 15abstract class HogeBase 16{ 17 [OnSerializing] 18 private void _onSerializing(StreamingContext sc) 19 { 20 OnSerializing(sc); 21 } 22 23 internal abstract void OnSerializing(StreamingContext sc); 24 25} 26 27[Serializable] 28class Hoge : HogeBase 29{ 30 internal override void OnSerializing(StreamingContext sc) 31 { 32 Console.WriteLine("HogeHoge"); 33 } 34}

投稿2016/06/30 03:07

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oriduru

2016/06/30 04:09

ひゃー。ありがとうございます! 見事にOnSerializing()メソッドの実装を強制させることができました! 仮想メソッドに[OnSerializing]属性を持たせられないなら、[OnSerializing]属性を持ったメソッドが仮想メソッドを呼べばいいということですね。 それと、確かにpublic修飾子は適切ではなく、internal修飾子が適切ですね…。勉強になります。 本当に困り果ててたので嬉しいです。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問