2017-03-09 68 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