0

考虑到这个 IronPython 脚本

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

...我如何访问的属性d

SensorEvent 方法的第一行成功打印

{ 消息 = 废话 }

但是第二行抛出异常:

'<>f_anonymousType[str]' 对象没有属性 'Message'


解释

d是由 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);
        }
    }
4

2 回答 2

3

d 是字典。像这样访问它:

d['Message']
于 2013-02-11T16:22:46.050 回答
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

没有得到提到的例外。

于 2013-02-11T17:15:11.193 回答