2011-12-29 2 views
4

С 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

Продлить 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

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

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