2013-02-11 2 views
0

Учитывая этот сценарий IronPythonКак получить доступ к анонимному типу?

def SensorEvent(d): 
    print d 
    print d.Message 

... как получить доступ свойства d?

Первая строка метода SensorEvent успешно печатает

{Сообщение = бла blubb}

однако вторая строка вызывает исключение:

'<> f_anonymousType [ул] 'объект не имеет атрибута' Сообщение '


Объяснение

d является экземпляром анонимного типа, представленного на Invoke из метода C#. Я ссылаюсь на это следующим образом:

public static async void ExecutePyFunc(string name, dynamic data) 
    { 
     try 
     { 
      var f = strategyScope.GetVariable<Action<object>>(name); 
      if (f != null) 
      { 
       await Task.Run(() => f((object)data)); 
      } 
     } 
     catch (Exception x) 
     { 
      StaticLog("[Callback Exception] Fehler beim Ausführen einer Python Funktion: {0}", x.Message); 
     } 
    } 

ответ

2

d - словарь. Доступ его следующим образом:

d['Message'] 
+0

я вижу. Благодарю. Есть ли способ получить к нему доступ, как объект? –

+0

Вы можете использовать python dict как объект. [См. Этот вопрос для методов.] (Http://stackoverflow.com/questions/1305532/convert-python-dict-to-object) – MrLeap

+0

Похоже, что все они выполняют бросок в скрипте Python. Есть ли способ сделать это снаружи, то есть до вызова? Я бы хотел, чтобы код Python был как можно более чистым и простым. –

2

Мое решение с помощью DynamicObject: Я ввел класс, который преобразует анонимный тип в известном типе путем копирования его свойств с помощью отражения (я ничего, кроме свойств, не нужно но он, вероятно, может быть расширен для использования с полями, методами, функциями).

Вот что я придумал:

public class IronPythonKnownType : DynamicObject 
{ 
    public IronPythonKnownType(dynamic obj) 
    { 
     var properties = obj.GetType().GetProperties(); 
     foreach (PropertyInfo prop in properties) 
     { 
      var val = prop.GetValue(obj); 
      this.Set(prop.Name, val); 
     } 
    } 

    private Dictionary<string, object> _dict = new Dictionary<string, object>(); 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     if (_dict.ContainsKey(binder.Name)) 
     { 
      result = _dict[binder.Name]; 
      return true; 
     } 
     return base.TryGetMember(binder, out result); 
    } 

    private void Set(string name, object value) 
    { 
     _dict[name] = value; 
    } 

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

, который эффективно преобразует анонимный объект во что-то IronPython может справиться.

Теперь я могу сделать это:

def Blubb(a): 
    print a.Message 

без получения упомянутого исключения.

Смежные вопросы