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

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

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

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

Q&A

解決済

3回答

6812閲覧

自分自身のクラスに値を代入したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2017/05/07 03:34

編集2017/05/07 04:22

###前提・実現したいこと
C#で設定ファイルを読み込む処理を実装しています。

###発生している問題・エラーメッセージ
どうやればクラス内のメソッドから自分自身のクラスに値を代入できるかわかりません。

###該当のソースコード
呼び出し元

C#

1 public partial class App : Application 2 { 3 4 public static Config config = new Config(); 5 6 #region Mainメソッド 7 [STAThread] 8 static void Main() 9 { 10 11 config.Load(); 12 13 App app = new App(); 14 app.InitializeComponent(); 15 app.Run(); 16 17 } 18 #endregion 19 20 }

Configクラス

C#

1 [JsonObject] 2 public class Config 3 { 4 5 private string file_name = "./config.json"; 6 7 [JsonProperty("debugMode")] 8 public bool DebugMode { get; set; } 9 10 [JsonProperty("clientToken")] 11 public string ClientToken { get; set; } 12 13 #region コンストラクター 14 public Config() 15 { 16 17 this.DebugMode = false; 18 this.ClientToken = Guid.NewGuid().ToString("N").Substring(0, 32); 19 20 } 21 #endregion 22 23 #region Loadメソッド 24 public void Load() 25 { 26 27 using (StreamReader reader = new StreamReader(file_name, Encoding.UTF8)) 28 { 29 30 this = JsonConvert.DeserializeObject<Config>(reader.ReadToEnd()); 31 32 } 33 34 } 35 #endregion 36 37 }

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

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

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

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

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

iwamoto_takaaki

2017/05/07 04:18

おそらく、thisに入力しようとしていること自体が問題なのですかが、解決策を提案するにはそうしたいと思った理由が解りません。Loadがあるクラスと呼び出しているコードをつけてもらいたいです。
guest

回答3

0

C#

1public class Config 2{ 3 // 前略 4 5 public static Config Load() 6 { 7 using (StreamReader reader = new StreamReader(file_name, Encoding.UTF8)) 8 { 9 return JsonConvert.DeserializeObject<Config>(reader.ReadToEnd()); 10 } 11 } 12 13 // 後略 14}

C#

1var config = Config.Load();

投稿2017/05/07 04:51

Zuishin

総合スコア28660

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

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

退会済みユーザー

退会済みユーザー

2017/05/07 06:11

その方法も考えましたがなんかスマートじゃない感じがします。 Visual Studioから提供させるあの設定システムのようにメソッドを呼び出すだけで終わらせたいです。
Zuishin

2017/05/07 06:48 編集

シングルトンを調べて下さい。
guest

0

Properties.Settingsと同じようにしたいなら

C#

1// 略 2private static Config _default = null; 3public static Config Default 4{ 5 get 6 { 7 /* _defaultがnullだったらLoadする */ 8 return _default 9 } 10} 11// 略 12// ReloadとかSaveとか必要に応じて

使用例

C#

1if(Config.Default.DebugMode) 2{ 3 //... 4}

投稿2017/05/08 00:12

ozwk

総合スコア13521

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

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

0

ベストアンサー

以下のようなヘルパークラスを実装しました。もっと良い解決方法がある気もするんですが…

C#

1 public class ConfigHelper 2 { 3 4 private string file_name = "./config.json"; 5 6 #region Loadメソッド 7 public static void Load(ref Config config) 8 { 9 10 using (StreamReader reader = new StreamReader(file_name, Encoding.UTF8)) 11 { 12 13 config = JsonConvert.DeserializeObject<Config>(reader.ReadToEnd()); 14 15 } 16 17 } 18 #endregion 19 20 #region Saveメソッド 21 public static void Save(Config config) 22 { 23 24 using (StreamWriter writer = new StreamWriter(file_name)) 25 { 26 27 writer.Write(JsonConvert.SerializeObject(config)); 28 29 } 30 31 } 32 #endregion 33 34 }

投稿2017/05/07 07:17

編集2017/05/07 07:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Zuishin

2017/05/07 07:29 編集

どこがスマートでどこが自分のクラスなんでしょうか? そしてどこが設定クラスに似ているんでしょうか?
aquaS

2017/05/07 07:53

これは酷い。 引数のref渡しもそうだけど、 Configのインスタンス生成と、Load呼び出しの2段階に分ける必要って? 状態として、インスタンスは生成したけどまだLoadしていない場合という余計な処理が必要になりますよね。 Zuishinさんの、一発でインスタンス生成とデータの読み込みを行う方がはるかにスマートな解だと思いますが。
len_souko

2017/05/07 11:28

スマートってなんだっけ?
退会済みユーザー

退会済みユーザー

2017/05/07 12:09

ごめんなさい、どうも Configで処理呼び出し ↓ MainでConfigに代入し直す っていうのがなんかもっと良い方法があるんじゃないかと思ってしまいました。 そして色々いじった結果がご覧の有様というわけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問