将关键字添加到ExpandoObject时,“关键字'此'在静态属性,静态方法或静态字段初始化程序中无效”

时间:2010-12-27 07:09:50

标签: c# dynamic expandoobject

我尝试向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'在a中无效   静态属性,静态方法或   静态字段初始化程序

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

4 个答案:

答案 0 :(得分:9)

嗯,你在lambda中使用this,它将引用创建Action的对象。你不能这样做,因为你是一个静态的方法。

即使您使用的是实例方法,它也不适用于this,因为它会引用创建Action的对象的实例,而不是ExpandoObject所在的实例重新抓住它。

您需要引用ExpandoObject(学生):

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

答案 1 :(得分:3)

你没有“这个”。

在创建lambda时捕获对象:

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

然后它有效。

答案 2 :(得分: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

答案 3 :(得分:0)

您正在从静态Main方法调用操作代码。在那里,您无法访问对象属性。您必须用

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

e.g。