2016-11-13 4 views
-1

Я столкнулся с действительно странной ситуацией, если я попытался в VS 2015, он без проблем справляется с базовым символьным методом. Даже VS-код с Omnisharp на Ubuntu 16.04 не имеет проблем для перехода к методу , Но когда я запускаю, он просто бросает какое-то странное исключение. Я% 100 уверен, что метод есть ...dotnet-core не удалось найти базовый метод интерфейса

Вот dotPeek Скриншот для /Yakari.Tests/{outputdir}/Yakari.dll

Screenshot

Вот структура:

public interface ICacheProvider : IDisposable 
{ 
    ..... 
    void Set(string key, object value, TimeSpan expiresIn, bool isManagerCall = false); 
    ..... 
} 


public interface ILocalCacheProvider : ICacheProvider 
{ 
    .... 
} 


public abstract class BaseCacheProvider : ICacheProvider 
{ 
    ..... 
    public abstract void Set(string key, object value, TimeSpan expiresIn, bool isManagerCall = false); 
    ..... 
} 


public class LittleThunder : BaseCacheProvider, ILocalCacheProvider 
{ 
    ..... 
    public override void Set(string key, object value, TimeSpan expiresIn, bool isManagerCall = false) 
    { 
     .... 
    } 
    ..... 
} 

Когда мы делаем что-то вроде этого:

public class SomeTestClass { 

    ILocalCacheProvider _localCacheProvider; 

    public SomeTestClass(ILocalCacheProvider localCacheProvider) { 
     _localCacheProvider = localCacheProvider; 
    } 

    public void SomeTestMethod() { 
     // Below line throws: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException : 'Yakari.ILocalCacheProvider' does not contain a definition for 'Set' 
     _localCacheProvider.Set("key", dynamic value, CacheTime.FifteenMinutes); 
    } 
} 

Код взят из https://github.com/TitaniumSoft/yakari

Примечание: Вы можете увидеть ту же ошибку во время выполнения в appveyor CI Log

Любые идеи? Спасибо и приветствую ...

+0

Я создал проблему (ошибка): https://github.com/dotnet/coreclr/issues/8126 – efaruk

+0

Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что OP не предоставил полную информацию для решения проблемы но OP хочет, чтобы каждый клонировал репозиторий Git, который может быть недоступен в будущем. –

+0

Я отредактировал следующую строку _localCacheProvider.Set («ключ», динамическое значение, CacheTime.FifteenMinutes); } Но если вы еще не счастливы, ни одно тело не останавливает вас. Но я думаю, вы должны быть более скромными;) – efaruk

ответ

2

Ошибка, которую вы получаете в GreatEagle.cs: строка 201 - это потому, что вы делаете интерфейсный вызов с чем-то, введенным как «динамический», переданным в качестве параметра. Если используется «динамическая» переменная, отправка интерфейса становится очень сложной, основанной на отражении и медленной.

Итак, для InMemoryCacheItem.ValueObject: почему свойство напечатано как «динамическое»? Из краткого поиска в вашем репо вы можете также набрать его как «объект» и избежать всех болей RuntimeBinder, так как вы производите его везде. Или, по крайней мере, сделать бросок для объекта, прежде чем передать его в Set().

+0

Это было очень полезно, я постараюсь как можно скорее. Спасибо ... – efaruk

+0

это сработало просто отлично, большое спасибо @Michal Strehovský ... – efaruk

+0

@efaruk Кстати, этот ответчик нашел, что за вашей проблемой случайно. Почему вы не упомянули, что используете динамическую типизацию? –

Смежные вопросы