«Ключевое слово« this »недопустимо в статическом свойстве, статическом методе или инициализаторе статического поля» при добавлении методов в ExpandoObject - PullRequest
9 голосов
/ 27 декабря 2010

Я пытаюсь добавить динамический метод в 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 ]

9 голосов
/ 27 декабря 2010

Ну, вы используете this в лямбде, который будет ссылаться на объект, который создает Action. Вы не можете сделать это, потому что у вас статический метод.

Даже если бы вы работали с методом экземпляра, он не работал бы с this, потому что он ссылался бы на экземпляр объекта, создающего Action, а не ExpandoObject, где вы его скрываете. *

Вам необходимо сослаться на ExpandoObject (студент):

student.Introduction=new Action(()=>
    Console.WriteLine("Hello my name is {0} {1}",student.FirstName,student.LastName);
);
3 голосов
/ 27 декабря 2010

Нет доступного вам "этого".

Захватывайте объект при создании лямбды:

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

Тогда это работает.

1 голос
/ 27 декабря 2010

Вы не можете использовать ключевое слово 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
0 голосов
/ 27 декабря 2010

Вы вызываете код действия из статического метода Main. Там вы не можете получить доступ к свойствам объекта. Вы должны заменить его на

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

, например

...