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

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

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

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

Q&A

解決済

3回答

10288閲覧

メソッドの引数に匿名型を渡す方法(再投稿)

matsujin_

総合スコア25

C#

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

0グッド

0クリップ

投稿2016/11/04 02:27

編集2016/11/04 05:32

申し訳ありません。
https://teratail.com/questions/53908
で質問した内容の再投稿になります。

dynamicを指定してできたと思っていたのですが
早とちりをしてしまい、ビルドを実行したらエラーが発生してしまい
出来ていませんでした。
以下の内容を再投稿させて頂きます。

================================================================
C#を始めて1週間ぐらいなのですが、
以下のコードのforeachのvar変数をメソッドに渡したいのですが、受け取るメソッドの引数の型に
varが指定できないのですがどうすればいいのでしょうか?
受け渡す前と受け取った後で同じように処理を記述したいと思ってます。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Testwebapplication { class TestClass { public int pro1 = 1; public int pro2 = 2; } class ExtendedClass : とある既存のフレームワークの抽象クラス { public フレームワークのオーバーライドしたメソッド() { TestClass[] test = { new TestClass(), new TestClass() }; foreach(var hoge in test.Select((e) => new { e })) { Console.WriteLine(hoge.e.pro1); Console.WriteLine(hoge.e.pro2); TestMethod(hoge); } } private void TestMethod(? hoge2) //<-varはエラーになる { Console.WriteLine(hoge2.e.pro1); // <-呼び出し元と同じように出力したい } } }

================================================================

追記:
・コードを詳細にしました。
・情報が不足しておりましたが、とある既存のシステムのWebアプリで前回担当されていた方が作成したフレームワークを使用しております。(担当された方に聞きたいのですが担当された方は・・・)
・ビルドすると「エラー CS0656 コンパイラが必要とするメンバー 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create' がありません」と表示されてしまいます。
・.NET Framewaork4.6です。
・VisualStudio2015で開発しています。

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

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

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

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

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

himakuma

2016/11/04 02:41 編集

普通にビルドも実行もできましたが、エラーの内容を記載してください。後コードをブロックで囲んで、テストコードをもう少し詳細に記載していただけませんか?
matsujin_

2016/11/04 04:18

情報が少なく申し訳ありません。追記を追加しました。
himakuma

2016/11/04 04:22

.NET Frameworkは4以上ですか?
matsujin_

2016/11/04 04:39

.NET Framework4.6になります。コードが上手く張り付いていなかったので再度コードを修正いたしました。
matsujin_

2016/11/04 05:00

追記を追加しました。
matsujin_

2016/11/04 05:33

コードの修正をしました。
guest

回答3

0

TestMethodメソッドがフレームワークのオーバーライドしたメソッドの中に書いてありますが、メソッドの中にメソッドは記述できませんよ。


上記の間違いはコピペミスでしょうか。とりあえず、匿名型オブジェクトを受け取るのはdynamicで間違いないので、起きている現象と質問の内容が食い違ってきていると思われます。コンパイルエラーであればエラーの発生した場所が特定できるので、その周辺のコードを貼り付けてください。

投稿2016/11/04 05:08

編集2016/11/04 05:24
catsforepaw

総合スコア5938

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

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

matsujin_

2016/11/04 05:32

指摘ありがとうございますm(_ _)m 修正いたしました。
matsujin_

2016/11/04 05:42

解決いたしました。 Microsoft.CSharpの参照設定がされていなかったのが原因だったようです。 ありがとうございましたm(_ _)m
guest

0

ベストアンサー

参照プロパティに「Microsoft.CSharp」はありますよね??
それのバージョンも4以上ですよね??

VisualStudio2015で開発していると思うのですが、もしかしたら参照先のファイルが破損しているかもです。
修復か、インストールしなおしてみたほうがいいかもです。。。

投稿2016/11/04 04:46

編集2016/11/04 04:48
himakuma

総合スコア952

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

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

matsujin_

2016/11/04 04:59 編集

申し訳りません。 残っていた.slnファイルを読み込んだだけなのですが VisualStudio2015の使い方もいまいち分かっていないのですが、参照プロパティとはどこから見ればいいのでしょうか。
himakuma

2016/11/04 05:09

プロジェクトのツリーを展開すると「参照設定」という項目があると思います。そこをさらに展開した一覧です。その中の「Microsoft.CSharp」を右クリックして「プロパティ」を表示して見てください。残されたファイルということはもしかしたらパスの参照に差異が出ているかもです。
himakuma

2016/11/04 05:12

プロジェクトのツリー⇒ソリューションエクスプローラーです。表示されていない場合、ヘッダメニューの表示の中にあるはずです。
matsujin_

2016/11/04 05:26

ありがとうございます。 えーと、プロジェクト(?)が3つあるみたいなのですが。 HOGE.Db、HOGE.App、HOGE.Utilです。 HOGE.Utilには「Microsoft.CSharp」があったのですが、現在追加したクラスHOGE.Appにはありませんでした。 これはすべてのプロジェクト(?)で参照しないと駄目なのでしょうか。
himakuma

2016/11/04 05:30

同じ定義でも参照はプロジェクトごとに行わないと参照できないです。
himakuma

2016/11/04 05:31

HOGE.AppにHOGE.Utilと同様の参照を追加してみてください。
matsujin_

2016/11/04 05:41

ビルドとおおおおおおおおおおおおおりました!!!!!!!!!! 長々と付き合って頂きありがとうございます!!!!!!!! 助かりましたm(_ _)m
himakuma

2016/11/04 05:45

お疲れ様です!!!( ・ω・)b
guest

0

こんにちは。

dynamicで問題ないですよ。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace ConsoleApplication1 8{ 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 TestClass[] test = { new TestClass(), new TestClass() }; 14 foreach (var hoge in test.Select((e) => new { e })) 15 { 16 Console.WriteLine(hoge.e.pro1); 17 Console.WriteLine(hoge.e.pro2); 18 TestMethod(hoge); 19 } 20 } 21 class TestClass 22 { 23 public int pro1 = 1; 24 public int pro2 = 2; 25 } 26 static private void TestMethod(dynamic hoge2) //<-varはエラーになる 27 { 28 Console.WriteLine(hoge2.e.pro1); // <-呼び出し元と同じように出力したい 29 } 30 } 31}

なお、staticが付いていないため、下記エラーがでました。

error CS0120: 静的でないフィールド、メソッド、またはプロパティ 'Program.TestMethod(dynamic)' で、オブジェクト参照が必要です

「静的でない」と日本語にしているから却って分かりにくいですが、ここは「staticでない」の意味です。
つまり、「staticでないメソッド'Program.TestMethod(dynamic)' はオブジェクトが必要です」。
クラスのメソッドを呼び出す際は普通はクラスのインスタンス(オブジェクト)を使って呼び出します。
下記のようなイメージです。この「オブジェクトがないよ」って言うエラーです。(分かりにくいですよね。)

TestClass foo;

foo.TestMethod(hoge);

今回の場合、TestMethodはクラス内のメンバ変数にアクセスしていないため、static(静的)な関数にしても問題ありませんので、staticを付けるとOKなのです。

投稿2016/11/04 03:17

編集2016/11/04 03:18
Chironian

総合スコア23272

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

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

matsujin_

2016/11/04 04:43

詳細な返答ありがとうございます。 staticにしましたが、ダメでした。 情報が不足しておりましたので、追記いたしましたが、今回はWebアプリで既存のフレームワークを継承しております。 ここまで大事になると思ってなかったので、情報が少なくて申し訳ありませんでした。
Chironian

2016/11/04 05:13

「フレームワークのオーバーライドしたメソッド()」の中でTestMethod()を定義してますが、メソッドの中で「普通の」メソッドは定義できない筈です。 TestMethod()の定義を「フレームワークのオーバーライドしたメソッド()」の外で行い、かつ、staticを付ければ大丈夫な筈ですよ。 ところで、このようなケースでは、コンパイル・エラーになる最小のソースを作ってそれを質問で提示すると良いですよ。 もしも、「とある既存のフレームワークの抽象クラス」に問題の原因があったら、我々に解決することは不可能ですので、それを除いた形で問題を再現する必要があります。
matsujin_

2016/11/04 05:47

指摘ありがとうございます。 今後は、最小限の状況で確認していきたいと思います。 あと、情報不足や記述ミスで混乱させて申し訳ありませんでした。 Microsoft.CSharpの参照設定がされていなかったのが原因だったようです。 ありがとうございましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問