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

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

ただいまの
回答率

87.35%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 8,270

score 26

申し訳ありません。
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で開発しています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • matsujin_

    2016/11/04 13:39

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

    キャンセル

  • matsujin_

    2016/11/04 14:00

    追記を追加しました。

    キャンセル

  • matsujin_

    2016/11/04 14:33

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

    キャンセル

回答 3

checkベストアンサー

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/04 14:31

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

    キャンセル

  • 2016/11/04 14:41

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

    キャンセル

  • 2016/11/04 14:45

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

    キャンセル

+1

こんにちは。

dynamicで問題ないですよ。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            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);
            }
        }
        class TestClass
        {
            public int pro1 = 1;
            public int pro2 = 2;
        }
        static private void TestMethod(dynamic hoge2) //<-varはエラーになる  
        {
            Console.WriteLine(hoge2.e.pro1); // <-呼び出し元と同じように出力したい  
        }
    }
}

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

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

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

TestClass foo;
foo.TestMethod(hoge);

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • この投稿は削除されました

  • 2016/11/04 13:43

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

    キャンセル

  • 2016/11/04 14:13

    「フレームワークのオーバーライドしたメソッド()」の中でTestMethod()を定義してますが、メソッドの中で「普通の」メソッドは定義できない筈です。
    TestMethod()の定義を「フレームワークのオーバーライドしたメソッド()」の外で行い、かつ、staticを付ければ大丈夫な筈ですよ。

    ところで、このようなケースでは、コンパイル・エラーになる最小のソースを作ってそれを質問で提示すると良いですよ。
    もしも、「とある既存のフレームワークの抽象クラス」に問題の原因があったら、我々に解決することは不可能ですので、それを除いた形で問題を再現する必要があります。

    キャンセル

  • 2016/11/04 14:47

    指摘ありがとうございます。
    今後は、最小限の状況で確認していきたいと思います。

    あと、情報不足や記述ミスで混乱させて申し訳ありませんでした。
    Microsoft.CSharpの参照設定がされていなかったのが原因だったようです。
    ありがとうございましたm(_ _)m

    キャンセル

+1

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/04 14:32

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

    キャンセル

  • 2016/11/04 14:42

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

    キャンセル

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る