考虑这个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);
}
}
答案 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
没有得到上述例外。