2017-03-09 1 views
0

현재 .net 4 dll을 .net 코어로 마이그레이션하는 중입니다. 단위 테스트를 이식하고 있지만 작동하지 않습니다.예외를 얻는 방법을 찾을 수 없습니다 : 'System.Runtime.CompilerServices.CallSiteBinder

이것은이 Matcher를 클래스의 나는 현재이 라인입니다

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); 
01 23,516,

그리고 이것은 내 단위 테스트 프로젝트의 현재 의존성이다 : 당신이 해설 섹션에 말씀을 바탕으로

<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 클래스에서 메서드 일치를 호출합니다.이 클래스는 다른 것이며 상속은 없습니다 – 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

관련 문제