2016-09-20 96 views
2

目前,我正在將.NET 4.5類庫轉換爲.NET Core類庫,該過程將引用.NETStandard v1.6.NET中的System.Runtime.CompilerServices標準庫

在我的部分代碼中(主要依賴於反射),我需要確定一個對象是否位於System.Runtime.CompilerServices命名空間中的Closure類型。該名稱空間和類型在.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框架版本打印出類型,您知道它是'Closure'或類似的東西?獲得該類型後,您可能很有可能在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框架所做的那樣),但你可以在系統運行時反射找回它(不要忘記using System.Reflection;GetTypeInfo()):

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

在。網絡框架,Closure是在不同的程序集(即,System.Core),但也是Expression,所以這個代碼應該在兩個工作。

+0

在這種情況下,爲了列出的代碼的目的,我認爲我只是簡單地檢查類型的FullName,因爲通過反射檢索類型依賴於完全相同的依賴關係。無論如何,這回答了這個問題。 –