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在 lambda 中使用,它将引用创建Action. 您不能这样做,因为您使用的是静态方法。

即使您在实例方法中,它也无法使用,this因为它会引用创建 的对象的实例Action,而不是ExpandoObject您将其放入的位置。

您需要参考 ExpandoObject(学生):

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

没有“这个”可供您使用。

在创建 lambda 时捕获对象:

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

然后它工作。

于 2010-12-27T07:19:04.853 回答
1

不能this在action中使用关键字,因为这里this指的是当前实例(不是student),导致编译错误,因为代码在静态方法中。检查这个:

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 回答