Метод получения исключения не найден: «System.Runtime.CompilerServices.CallSiteBinder

В настоящее время я работаю над переносом .net 4 dll на .net core. Я переношу свои модульные тесты, но не могу заставить их работать.

Это мой проект.json для dll

{
  "version": "1.0.0-*",

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

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

Это класс, который я сейчас тестирую

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, вызывающая исключение:

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>


person Jawen    schedule 09.03.2017    source источник
comment
Это только я или это кажется самореферентным?   -  person vipersassassin    schedule 09.03.2017
comment
Нет, основным классом является Matcher, и я вызываю метод Match из класса ElementMatcher, который отличается и не имеет наследования   -  person Jawen    schedule 09.03.2017
comment
У вас есть исходный код ElementMatcher.Match?   -  person Rodrigo Vedovato    schedule 10.03.2017
comment
@RodrigoVedovato да, я обновил свои фрагменты. Также этот код работает на Net Framework v.4.0.   -  person Jawen    schedule 10.03.2017
comment
@Jawen Я не буду использовать это как ответ, потому что я не уверен на 100%, но есть ли способ удалить приведение к динамическому в последней строке?   -  person Rodrigo Vedovato    schedule 10.03.2017
comment
@RodrigoVedovato Нет, потому что IMatcher определяет 3 интерфейса, и параметр может иметь разные типы. Я использую dynamic, чтобы решить, какой метод вызывать. Чтобы уточнить:   -  person Jawen    schedule 10.03.2017
comment
открытый интерфейс IMatcher { bool Match (строковый ключ); bool Match (ключ DateTime); логическое совпадение (длинный ключ); }   -  person Jawen    schedule 10.03.2017
comment
@RodrigoVedovato может быть конфликт сетевых версий? Я не знаю, как найти несовместимость.   -  person Jawen    schedule 10.03.2017
comment
@Jawen Я выскажу свое мнение в разделе ответов!   -  person Rodrigo Vedovato    schedule 10.03.2017


Ответы (1)


Основываясь на том, что вы сказали в разделе комментариев, я не думаю, что проблема возникает из-за какого-то конфликта между версиями фреймворка. Вы сказали, что переносите свою библиотеку на .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;
    }
}

Таким образом, вы можете удалить динамическое приведение.

person Rodrigo Vedovato    schedule 09.03.2017