0

この IronPython スクリプトを検討する

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

... のプロパティにアクセスするにはどうすればよいですdか?

SensorEvent メソッドの最初の行が正常に出力されます

{ メッセージ = 何とかブラブ }

ただし、2 行目で例外がスローされます。

'<>f_anonymousType[str]' オブジェクトには属性 'Message' がありません


説明

dC# メソッドからの呼び出しによって提供される匿名型のインスタンスです。私は次のように呼び出しています:

    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 に答える