作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一个通用函数来从任意提供的动态对象中提取一个值,但不知道如何调用 TryGetMember
因为它需要 GetMemberBinder
这是抽象的,因此我无法创建它。
样本...
public object GetValue(DynamicObject Source, string FieldName)
{
object Result = null;
GetMemberBinder Binder = x; // What object must be provided?
Binder.Name = FieldName;
if (Source.TryGetMember(Binder, out Result))
return Result;
throw new Exception("The field '" + FieldName + "' not exists");
}
最佳答案
我不确定框架中是否有任何方法实际返回 GetMemberBinder
,但没关系 - 这不是按名称调用动态成员的正确方法。
您实际需要做的是创建一个调用站点。该方法如下所示:
static object GetDynamicMember(object obj, string memberName)
{
var binder = Binder.GetMember(CSharpBinderFlags.None, memberName, obj.GetType(),
new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) });
var callsite = CallSite<Func<CallSite, object, object>>.Create(binder);
return callsite.Target(callsite, obj);
}
Binder.GetMember
创建一个
CallSiteBinder
,
不是 一个
GetMemberBinder
.只是为了100%清楚。此方法将抛出
RuntimeBinderException
如果内部调用
TryGetMember
失败,因此您无需检查结果。如果您不希望来电者看到
RuntimeBinderException
然后将其包装在您自己的 try/catch 中。
Binder
方法返回
CallSiteBinder
而且您不能直接实例化任何活页夹。
ExpandoObject
而不是
DynamicObject
然后记住它实现了
IDictionary<string, object>
,所以你不需要做任何这些。只需将其转换为字典类型并检查该属性是否存在。我只会使用
DynamicObject
超过
ExpandoObject
如果我做的事情比简单地在运行时添加成员要复杂得多,即根据运行时绑定(bind)器更改实际行为。
关于.net - 如何直接调用 DynamicObject.TryGetMember?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5306018/
我正在实现一个通用函数来从任意提供的动态对象中提取一个值,但不知道如何调用 TryGetMember因为它需要 GetMemberBinder这是抽象的,因此我无法创建它。 样本... public
我有以下类用于绑定(bind)到 WPF DataGrid 上动态生成的列。列绑定(bind)必须是属性名称,我可以将适当命名的属性添加到 DynamicObject: public class Bi
在我的 C++/CLI 项目中,我尝试访问位于派生自 DynamicObject 的类中的 TryGetMember 方法。此类是 C# DLL 的一部分。 TryGetMember 将 GetMem
我正在尝试将动态对象移交给 Ironpython,但 Ironpython 似乎并未调用 TryInvokeMember。相反,它会调用 TryGetMember 并给出无法调用结果的错误。 我已经用
我是一名优秀的程序员,十分优秀!