Добавление новых динамических свойств - PullRequest
5 голосов
/ 15 декабря 2010

мы читаем в msdn мы «Добавление новых динамических свойств» с помощью класса DynamicObject я пишу следующую программу

public class DemoDynamicObject : DynamicObject
{

}
class Program
{
    public static void Main()
    {
        dynamic dd = new DemoDynamicObject();
        dd.FirstName = "abc";
    }
}

Но когда я запускаю эту программу, она выдает ошибку во время выполнения: «DemoDynamicObject» не содержит определения «FirstName» если мы добавляем динамическое свойство с помощью класса DynamicObject, то почему оно может выдавать эту ошибку Кто-нибудь может сказать мне причину и решение?

1 Ответ

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

При использовании DynamicObject в качестве базового класса вы должны предоставить конкретные переопределения для TryGetMember и TrySetMember для отслеживания создаваемых вами динамических свойств (на основе документации MSDN DynamicObject ):

class DemoDynamicObject: DynamicObject
{
    Dictionary<string, object> dictionary
        = new Dictionary<string, object>();

    public override bool TryGetMember(
        GetMemberBinder binder, out object result)
    {
        string name = binder.Name;
        return dictionary.TryGetValue(name, out result);
    }

    public override bool TrySetMember(
        SetMemberBinder binder, object value)
    {
        dictionary[binder.Name] = value;
        return true;
    }
}

Если вы просто хотите иметь динамический объект, к которому можно добавить свойства, вы можете просто использовать экземпляр ExpandoObject и пропустить пользовательский класс, наследуемый от DynamicObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...