10

(動的に追加された) プロパティを返す動的メソッドを ExpandoObject に追加しようとしていますが、常にエラーが発生します。

私はここで何か間違っていますか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Dynamic;

namespace DynamicDemo
{
class ExpandoFun
{
    public static void Main()
    {
        Console.WriteLine("Fun with Expandos...");
        dynamic student = new ExpandoObject();
        student.FirstName = "John";
        student.LastName = "Doe";
        student.Introduction=new Action(()=>
      Console.WriteLine("Hello my name is {0} {1}",this.FirstName,this.LastName);
    );

        Console.WriteLine(student.FirstName);
        student.Introduction();
    }
}
}

コンパイラは次のエラーにフラグを立てています: エラー 1

キーワード 'this' は、静的プロパティ、静的メソッド、または静的フィールド初期化子では無効です

D:\rnd\GettingStarted\DynamicDemo\ExpandoFun.cs 20 63 DynamicDemo

4

4 に答える 4

9

ラムダで使用thisしています。ラムダは、を作成しているオブジェクトを参照しますAction。静的メソッドを使用しているため、これを行うことはできません。

インスタンスメソッドを使用している場合でも、それは、タックしている場所ではなく、thisを作成しているオブジェクトのインスタンスを参照するため、機能しません。ActionExpandoObject

ExpandoObject(学生)を参照する必要があります。

student.Introduction=new Action(()=>
    Console.WriteLine("Hello my name is {0} {1}",student.FirstName,student.LastName);
);
于 2010-12-27T07:21:21.207 に答える
3

あなたが利用できる「これ」はありません。

代わりに、ラムダを作成するときにオブジェクトをキャプチャします。

student.Introduction = new Action( ()=> Console.WriteLine("Hello my name is {0} {1}", student.FirstName, student.LastName) );

その後、それは動作します。

于 2010-12-27T07:19:04.853 に答える
1

thisアクションでキーワードを使用することはできませんthis。これは、コードが静的メソッドにあるためにコンパイルエラーが発生する現在のインスタンス(学生ではない)を参照しているためです。これをチェックして:

dynamic student = new ExpandoObject();
student.FirstName = "John";
student.LastName = "Doe";
student.Introduction = new Action(() => Console.WriteLine("Hello my name is {0} {1}", student.FirstName, student.LastName));
Console.WriteLine(student.FirstName);
student.Introduction();
student.FirstName = "changed";
Console.WriteLine(student.FirstName);
student.Introduction();

出力:

John Doe
Hello my name is John Doe
changed Doe
Hello my name is changed Doe
于 2010-12-27T07:21:15.737 に答える
0

静的Mainメソッドからアクションコードを呼び出しています。そこでは、オブジェクトのプロパティにアクセスできません。に置き換える必要があります

student.Introduction = new Action(
    () =>
    {
        Console.WriteLine("Hello my name is {0} {1}", student.FirstName, student.LastName);
    };

例えば

于 2010-12-27T07:20:15.977 に答える