2017-03-09 26 views
0

我目前正在将.net 4 dll迁移到.net核心。 我正在移植我的单元测试,但无法让他们工作。获取异常找不到方法:'System.Runtime.CompilerServices.CallSiteBinder

这是我的dll

{ 
 
    "version": "1.0.0-*", 
 

 
    "dependencies": { 
 
    "NETStandard.Library": "1.6.1", 
 
    }, 
 

 
    "frameworks": { 
 
    "netstandard1.6": { 
 
     "imports": "dnxcore50" 
 
    } 
 
    } 
 
}

project.json这是目前我测试

public class Matcher 
{ 
    public List<ElementMatcher> matchers{ get; set; } 

    public bool Match(string item, Dictionary<string, object> elements) 
    { 

       foreach(var matcher in matchers) 
       { 
        var result = matcher.Match(item, elements); 
        if (!result) 
        { 
         return false; 
        } 
       } 
       return true; 

    } 
} 

public class ElementMatcher 
{ 
    public string attribute { get; set; } 
    public IMatcher matcher { get; set; } 

    public virtual bool Match(string key, Dictionary<string, object> attributes) 
    { 
     if (attribute == null) 
     { 
      return matcher.Match(key); 
     } 

     if (attributes == null) 
     { 
      return false; 
     } 

     object value; 
     attributes.TryGetValue(attribute, out value); 

     if (value == null) 
     { 
      return false; 
     } 

     return matcher.Match((dynamic)value); 
    } 
} 

这是该行的类,在匹配器类,抛出异常:

matcher.Match(item, elements); 

这是我的单元测试项目当前的依赖关系:

<packages> 
 
    <package id="Castle.Core" version="4.0.0" targetFramework="net462" /> 
 
    <package id="Microsoft.CSharp" version="4.3.0" targetFramework="net462" /> 
 
    <package id="Microsoft.Win32.Primitives" version="4.0.1" targetFramework="net462" /> 
 
    <package id="Moq" version="4.7.1" targetFramework="net462" /> 
 
    <package id="System.Diagnostics.DiagnosticSource" version="4.0.0" targetFramework="net462" /> 
 
    <package id="System.IO" version="4.1.0" targetFramework="net462" /> 
 
    <package id="System.IO.FileSystem" version="4.0.1" targetFramework="net462" /> 
 
    <package id="System.IO.FileSystem.Primitives" version="4.0.1" targetFramework="net462" /> 
 
    <package id="System.IO.FileSystem.Watcher" version="4.0.0" targetFramework="net462" /> 
 
    <package id="System.Linq" version="4.1.0" targetFramework="net462" /> 
 
    <package id="System.Linq.Expressions" version="4.1.0" targetFramework="net462" /> 
 
    <package id="System.Net.Http" version="4.1.0" targetFramework="net462" /> 
 
    <package id="System.Net.NameResolution" version="4.0.0" targetFramework="net462" /> 
 
    <package id="System.Reflection" version="4.1.0" targetFramework="net462" /> 
 
    <package id="System.Runtime" version="4.1.0" targetFramework="net462" /> 
 
    <package id="System.Runtime.Extensions" version="4.1.0" targetFramework="net462" /> 
 
    <package id="System.Security.Cryptography.Algorithms" version="4.2.0" targetFramework="net462" /> 
 
    <package id="System.Security.Cryptography.Encoding" version="4.0.0" targetFramework="net462" /> 
 
    <package id="System.Security.Cryptography.Primitives" version="4.0.0" targetFramework="net462" /> 
 
    <package id="System.Security.Cryptography.X509Certificates" version="4.1.0" targetFramework="net462" /> 
 
    <package id="System.Text.RegularExpressions" version="4.1.0" targetFramework="net462" /> 
 
    <package id="System.Threading.Thread" version="4.0.0" targetFramework="net462" /> 
 
</packages>

+0

难道只是我还是这似乎是自我参照? – vipersassassin

+0

不,主类是匹配器,我从ElementMatcher类调用方法Match,这是不同的,并且没有继承关系 – Jawen

+0

您是否拥有ElementMatcher.Match的源代码? –

回答

2

根据您的评论部分说了什么,我不认为会发生,因为一些冲突的问题在框架版本之间。你说过你正在将你的库移植到.NET Core上,所以可能不是所有的东西都得到完全支持。整个“投入动态然后决定调用哪种方法”可能会造成问题(并且这不是一个很好的方法来解决这种问题),所以我会尝试做这样的事情:

public interface IMatcher 
{ 
    bool Match(object value); 
    bool Match(string key); 
    bool Match(DateTime key); 
    bool Match(long key); 
} 

public class MyMatcher : IMatcher 
{ 
    public bool Match(object value) 
    { 
     if (value is string) 
     { 
      return Match(value as string); 
     } 
     else if (value is DateTime) 
     { 
      return Match(value as DateTime); 
     } 
     else if (value is long) 
     { 
      return Match(value as long); 
     } 

     return false; 
    } 
} 

这样,你可以删除动态演员..

+0

工作。谢谢!! – Jawen