我尝试向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
答案 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。