2016-09-20 7 views
2

В настоящее время я в процессе преобразования библиотеки классов .NET 4.5 в библиотеку классов .NET Core, ссылаясь на .NETStandard v1.6.System.Runtime.CompilerServices в .NET Стандартная библиотека

В части моего кода (сильно полагающегося на отражение) Мне нужно определить, имеет ли объект тип Closure, который находится в пространстве имен System.Runtime.CompilerServices. Это пространство имен и их тип недоступны в .NETStandard v1.6.

  • Был ли этот тип перемещен, или он больше не доступен?
  • Поскольку мой код полагался на него, что является альтернативой, если оно недоступно в .NETStandard?

Конкретный код, опираясь на Closure определяет типы параметров делегата, пропуская компилятор генерируется Closure из них.

Delegate toWrap; 
MethodInfo toWrapInfo = toWrap.GetMethodInfo(); 
var toWrapArguments = toWrapInfo.GetParameters() 
    // Closure argument isn't an actual argument, but added by the compiler. 
    .SkipWhile(p => p.ParameterType == typeof(Closure)) 
    .Select(p => p.ParameterType); 
+1

Вы пытались распечатать тип, где вы знаете, что это «Закрытие» или подобное, при использовании старой версии каркаса .net? После такого типа у вас могут быть хорошие шансы найти соответствующий класс (каким-то образом связанный с вашим типом) в каталоге объектов в visual studio. –

+0

@ChrisTophski Я нахожусь на нем. Как только мой мигрированный код скомпилируется, я запустил свои тесты и посмотрю, что изменилось. Если никто другой не ответит на этот вопрос к тому времени, я это сделаю. ; p –

+0

Используйте http://packagesearch.azurewebsites.net –

ответ

1

В .Net Ядра 1.0 Closure exists in the System.Linq.Expressions assembly in the System.Linq.Expressions package, но он не подвергается в эталонной сборки. Это означает, что это всего лишь деталь реализации в Core (и может, например, исчезнуть или перейти в будущую версию). Это также означает, что вы не можете ссылаться на него во время компиляции (как вы это делали в .Net Framework), но вы можете получить его с помощью отражения во время выполнения (не забудьте using System.Reflection; для GetTypeInfo()):

Type closureType = typeof(Expression).GetTypeInfo().Assembly 
    .GetType("System.Runtime.CompilerServices.Closure"); 

В. Net Framework, Closure находится в другой сборке (а именно System.Core), но так же Expression, поэтому этот код должен работать на обоих.

+0

В этом случае, с учетом приведенного кода, я полагаю, что я просто просто проверяю 'FullName' типа, поскольку извлечение типа через отражение зависит от той же зависимости. Несмотря на это, это отвечает на вопрос. –

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