我有DynamicObject
的以下实现:
public sealed class DynamicDictionary : DynamicObject
{
private readonly Dictionary<string, string> _dictionary = new Dictionary<string, string>();
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string tmpResult;
if (!_dictionary.TryGetValue(binder.Name, out tmpResult))
{
result = null;
return true;
}
result = tmpResult;
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_dictionary[binder.Name] = value.ToString();
return true;
}
}
当这是在针对完整框架的项目中构建时,例如net451
或netstandard1.6
项目中,以下代码运行没有问题:
dynamic dic = new DynamicDictionary();
dic.Foo = "bar";
string bar = dic.Foo;
但是,当我尝试使用以下netstandard
在多目标Net451
项目(同时支持netstandard1.6
和project.json
)中构建此项时:
{
"frameworks": {
"net451": {
},
"netstandard1.6": {
"dependencies": {
"NETStandard.Library": "1.6.1",
"System.Dynamic.Runtime": "4.3.0",
"Microsoft.CSharp": "4.3.0"
},
"buildOptions": {
"define": [ "NET_STANDARD" ]
}
}
},
"buildOptions": {
"warningsAsErrors": true
}
}
项目编译时没有错误或警告,并产生两个dll,每个框架一个(net451
和netstandard1.6
)。
在netstandard1.6
上运行的控制台应用中引用netcoreapp1.1
版本会执行上面的示例代码而不会出现问题,但是当我引用net451
dll时针对执行示例代码的net451
构建的控制台应用程序抛出:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll
据我所知,只有当TryGetMember()
类中的TrySetMember()
或DynamicDictionary
方法返回false
时,才会抛出此异常,表示无法检索到该值或设置在基础词典上。
对这些方法中的任何一个设置断点都表明它们永远不会被调用,即使我可以在基础字典中看到“bar”的值。
我怀疑在针对net451
构建多目标项目时未正确引用某些dll。
有什么想法吗?