在NetStandard中进行多重定位时使用DynamicObject

时间:2017-01-02 15:46:36

标签: c# .net dynamic .net-core .net-standard

我有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;
    }
}

当这是在针对完整框架的项目中构建时,例如net451netstandard1.6项目中,以下代码运行没有问题:

dynamic dic = new DynamicDictionary();
dic.Foo = "bar";    
string bar = dic.Foo;

但是,当我尝试使用以下netstandard在多目标Net451项目(同时支持netstandard1.6project.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,每个框架一个(net451netstandard1.6)。

netstandard1.6上运行的控制台应用中引用netcoreapp1.1版本会执行上面的示例代码而不会出现问题,但是当我引用net451 dll时针对执行示例代码的net451构建的控制台应用程序抛出: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll

据我所知,只有当TryGetMember()类中的TrySetMember()DynamicDictionary方法返回false时,才会抛出此异常,表示无法检索到该值或设置在基础词​​典上。

对这些方法中的任何一个设置断点都表明它们永远不会被调用,即使我可以在基础字典中看到“bar”的值。

我怀疑在针对net451构建多目标项目时未正确引用某些dll。

有什么想法吗?

0 个答案:

没有答案