2017-03-09 8 views
0

現在、.net 4 dllを.netコアに移行する作業を進めています。 ユニットテストを移植していますが、動作させることはできません。例外を取得する方法が見つかりません: 'System.Runtime.CompilerServices.CallSiteBinder

これは、これは私が現在、これは、マッチャークラスでは、ラインである

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); 
    } 
} 

をテストしていたクラスであるDLL

{ 
 
    "version": "1.0.0-*", 
 

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

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

のための私のproject.jsonです、スロー例外:

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

いいえ、メインクラスはMatcherです。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

関連する問題