Динамическая оценка свойств - PullRequest
4 голосов
/ 29 декабря 2011

С DLR я хотел бы сделать что-то вроде этого:

class MyClass {
   int MyProperty { get; set; }
}

В бритве я бы сделал что-то вроде этого.(InstanceOfMyClass - это некоторый динамический объект, который просматривает экземпляр MyClass)

@InstanceOfMyClass.MyProperty

Это вывело бы строковое представление MyProperty.

Теперь, если я сделаю это.

@InstanceOfMyClass.MyMissingProperty

Я бы хотел вывести «Missing: MyMissingProperty».Я хотел бы захватить все выражение, например, так.

@InstanceOfMyClass.MyMissingProperty.MoreMissing

Может потенциально вывести «Missing: MyMissingProperty.MoreMissing», но это может потребовать большого количества DLR.ExpandoObject разрешить мне сделать это?Если нет, что я должен сделать, чтобы реализовать это?

Ответы [ 3 ]

3 голосов
/ 29 декабря 2011

Расширить DynamicObject.TryGetMember следующим образом:

Если элемент существует, вернуть значение.Если элемент не существует, вернуть новый экземпляр класса, который будет обрабатывать как строковое представление отсутствующего свойства, так и цепочку.Примерно так

public class MissingPropertyChain : DynamicObject
{
    private string property;

    public MissingPropertyChain(string property)
    {
        this.property = property;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    {
        if(binder.Name == "ToString")
            result = "Missing property: " + property;
        else
            result = new MissingPropertyChain( property + "." + binder.Name;

        return true;
    }
}

Я не пробовал, но думаю, что это даст вам представление о том, как решить проблему.

Надеюсь, это поможет.

0 голосов
/ 29 декабря 2011

Этого можно достичь, создав собственную версию DynamicObject, а затем перезаписать TryGetMember

http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx

0 голосов
/ 29 декабря 2011

Я не уверен насчет Expando, он скорее используется, когда вы хотите установить свойство, а затем получить его. Однако из того, что вы пишете, кажется, что вы хотели бы прочитать любое значение , которое не было установлено ранее.

Для этого можно использовать DynamicObject. Вы просто переопределяете TryGetMember.

...