如何访问匿名类型的属性?

时间:2013-02-11 16:19:42

标签: dynamic ironpython invoke anonymous-types

考虑这个IronPython脚本

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

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

SensorEvent方法的第一行成功打印

  

{Message = blah blubb}

然而第二行抛出异常:

  

'<> f_anonymousType [STR]'对象没有属性'消息'


解释

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);
        }
    }

2 个答案:

答案 0 :(得分:2)

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

d['Message']

答案 1 :(得分: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

没有得到上述例外。