gpt4 book ai didi

c# - IDynamicMetaObjectProvider 使用文字名称设置属性

转载 作者:太空宇宙 更新时间:2023-11-03 23:35:20 25 4
gpt4 key购买 nike

我需要使用字符串 propertyName 设置 DynamicObject 属性。我找到了使用这个 answer 获取属性值的方法,但是当谈到 setValue 时,我不太确定如何重写代码以设置属性。我收到运行时错误并且不太确定表达式逻辑。我想知道您是否可以建议任何关于如何实现 void SetProperty(object o, string member,object value) 方法的想法。

最佳答案

在某些情况下,例如 ExpandoObject , 然后你可以使用 IDictionary<string,object> API 代替:

ExpandoObject obj = ...
var dict = (IDictionary<string, object>)obj;
object oldVal = dict[memberName];
dict[memberName] = newVal;

在更一般的情况下 IDynamicMetaObjectProvider : 你可以借CallSiteCache来自 FastMember:

internal static class CallSiteCache
{
private static readonly Hashtable getters = new Hashtable(), setters = new Hashtable();

internal static object GetValue(string name, object target)
{
CallSite<Func<CallSite, object, object>> callSite = (CallSite<Func<CallSite, object, object>>)getters[name];
if (callSite == null)
{
lock (getters)
{
callSite = (CallSite<Func<CallSite, object, object>>)getters[name];
if (callSite == null)
{
CallSite<Func<CallSite, object, object>> newSite = CallSite<Func<CallSite, object, object>>.Create(Binder.GetMember(CSharpBinderFlags.None, name, typeof(CallSiteCache), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }));
getters[name] = callSite = newSite;
}
}
}
return callSite.Target(callSite, target);
}
internal static void SetValue(string name, object target, object value)
{
CallSite<Func<CallSite, object, object, object>> callSite = (CallSite<Func<CallSite, object, object, object>>)setters[name];
if (callSite == null)
{
lock (setters)
{
callSite = (CallSite<Func<CallSite, object, object, object>>)setters[name];
if (callSite == null)
{
CallSite<Func<CallSite, object, object, object>> newSite = CallSite<Func<CallSite, object, object, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, name, typeof(CallSiteCache), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null) }));
setters[name] = callSite = newSite;
}
}
}
callSite.Target(callSite, target, value);
}
}

注意这里我们可以输入target作为IDynamicMetaObjectProvider ,但我们实际上并不需要 - CallSite API 不需要它。

关于c# - IDynamicMetaObjectProvider 使用文字名称设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30757372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com